вот пример моих данных:
'_id' => new MongoId("54087e076c03943c3c8b456b"),
'fornitureFuture' =>
array (
'0' =>
array (
'data_start'▼ => new MongoDate(1412114400, 0),
'data_end' => new MongoDate(1414710000, 0),
'f1' => '65',
'f2' => new MongoInt32(0),
'f3' => '45',
'fornitore' => new MongoId("5346cb2ab9d6f0021e6b18a0"),
),
'1' =>
array (
'data_start' => new MongoDate(1420066800, 0),
'data_end' => new MongoDate(1427752800, 0),
'f1' => '63.75',
'f2' => new MongoInt32(0),
'f3' => '70.4',
'fornitore' => new MongoId("533406896c0394a62c8b4569"),
),
мне нужно найти, если существуют данные в fornitureFuture с моим MongoDate между data_start и data_end …
первая группа data_start — 01.10.2014 и data_end 31.10.2014
Вторая группа data_start — 01.01.2015 и data_end 31.03.2015
Что-то вроде:
//today is 09/19/2014
$dataTest = mktime(0,0,0,date('n')+2,14,date('Y')); //return 11/14/2014
$testMese = $this->db->getOne('MyCollection', array('_id'=> new \MongoId($thisPodPdr['_id']), 'fornitureFuture.data_start'=>array('$lte'=> new \MongoDate($dataTest)) , 'fornitureFuture.data_end'=>array('$gt'=> new \MongoDate($dataTest)) ) , array('fornitureFuture'=>1) );
Я ожидаю пустой ответ, но возвращаю запись ..
2 пример:
$dataTest = mktime(0,0,0,date('n')+7,14,date('Y')); //return 04/14/2015
$testMese = $this->db->getOne('MyCollection', array('_id'=> new \MongoId($thisPodPdr['_id']), 'fornitureFuture.data_start'=>array('$lte'=> new \MongoDate($dataTest)) , 'fornitureFuture.data_end'=>array('$gt'=> new \MongoDate($dataTest)) ) , array('fornitureFuture'=>1) );
верните правильно пусто!
Мне нужно проверить в том же блоке … что-то вроде
'fornitureFuture.$.data_start'=>array('$lte'=> new \MongoDate($dataTest)) , 'fornitureFuture.$.data_end'=>array('$gt'=> new \MongoDate($dataTest))
но не работает.
\ is from namespace и this-> db-> getOne (collection, $ query, $ fields) — моя функция, подобная $ this-> collection-> findOne ($ query, $ fields);
Нет синтаксической ошибки.
извините за мой английский и спасибо за помощь
Ваш первый пример, который возвращает 2 результата, когда вы не ожидаете ничего, выполняет следующий запрос:
[
'_id' => new MongoId(...),
'fornitureFuture.data_start' => ['$lte' => new MongoDate(1418533200)],
'fornitureFuture.data_end' => ['$gt' => new MongoDate(1418533200)],
]
Предоставленный вами пример документа содержит два элемента массива со следующими диапазонами дат:
1412114400
в 1414710000
1420066800
в 1427752800
Этот документ соответствует, потому что 1412114400
(первого элемента) меньше 1418533200
, а также 1427752800
(второго элемента) больше чем 1418533200
, Просто ссылаясь на fornitureFuture.data_start
а также fornitureFuture.data_end
Соответствующий запрос MongoDB будет удовлетворен, если подполе какого-либо элемента массива соответствует критериям.
Вы, вероятно, захотите ограничить критерии начала / окончания одним и тем же элементом массива, и в этом случае $elemMatch
это то, что вы ищете:
[
'_id' => new MongoId(...),
'fornitureFuture' => [
'$elemMatch' => [
'data_start' => ['$lte' => new MongoDate(1418533200)],
'data_end' => ['$gt' => new MongoDate(1418533200)],
],
],
]
Этот критерий теперь должен соответствовать только тогда, когда даты начала / окончания тот же элемент удовлетворить диапазон. На связанной ноте, вы также можете быть заинтересованы в $
оператор проекции, чтобы ограничить fornitureFuture
только для соответствующего элемента (ов).
Других решений пока нет …