mongodb — БД MONGO — PHP. Запрос в несколько вложенных полей данных

вот пример моих данных:

 '_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);

Нет синтаксической ошибки.

извините за мой английский и спасибо за помощь

1

Решение

Ваш первый пример, который возвращает 2 результата, когда вы не ожидаете ничего, выполняет следующий запрос:

[
'_id' => new MongoId(...),
'fornitureFuture.data_start' => ['$lte' => new MongoDate(1418533200)],
'fornitureFuture.data_end' => ['$gt' => new MongoDate(1418533200)],
]

Предоставленный вами пример документа содержит два элемента массива со следующими диапазонами дат:

  1. 1412114400 в 1414710000
  2. 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 только для соответствующего элемента (ов).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]