2013-05-06 2 views
1

У меня есть документ, подобный приведенному ниже. Поле periods определяет периоды, когда пользователь имел доступ к некоторым данным.Как запросить два поля во встроенном массиве?

{ 
    "_id":ObjectId("51878ecc0e9528429ab6e7cf"), 
    "name" : "Peter Flack", 
    "periods":[ 
     { 
     "from":1, 
     "to":2 
     }, 
     { 
     "from":4, 
     "to":6 
     }, 
     { 
     "from":10, 
     "to":12 
     } 
    ] 
} 

Теперь я хочу, чтобы определить, является ли произвольный период в любой из периодов в period поле. Я попытался следующие:

db.subs.find({"periods.from" : {$gte : 1}, "periods.to" : {$lte : 12}, "periods.from" : {$lte : 12}, "periods.to" : {$gte : 1}}) 

Этот запрос возвращает документ, поскольку есть один элемент в массиве с from> = 1 и antoher элемент с to < = 12.

Но, я хочу верните документ только в том случае, если оба from и toв том же элементе соответствуют критериям.

Как бы написать запрос для достижения этого?

ответ

4

Вы должны использовать $ elemMatch: соответствие elemMatch для параметров в каждом элементе массива.

Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 1, $lte:12}, to : {$gte : 1, $lte : 12} }}}).pretty() 
{ 
    "_id" : ObjectId("51878ecc0e9528429ab6e7cf"), 
    "name" : "Peter Flack", 
    "periods" : [ 
     { 
      "from" : 1, 
      "to" : 2 
     }, 
     { 
      "from" : 4, 
      "to" : 6 
     }, 
     { 
      "from" : 10, 
      "to" : 12 
     } 
    ] 
} 
Mongo > db.subs.find({periods : {$elemMatch : { from : {$gte : 2, $lte : 4}, to : {$gte : 10, $lte : 12} }}}).pretty() 
no result 
+0

К сожалению, не работает. Насколько я понимаю, $ elemMatch предназначен для проекта. То есть, это влияет только на то, какие поля в документе возвращаются, а не если документ должен быть возвращен или нет. Глядя в документацию, он используется только во втором аргументе функции find(). – luttkens

+0

@luttkens '$ elemMatch' также является оператором запроса. Документы [здесь] (http://docs.mongodb.org/manual/reference/operator/elemMatch/#op._S_elemMatch). По мере того как вы написали запрос, он работает нормально, я думаю, что ваши операторы '$ gte' и' $ lte' заменены на то, что вы действительно ищете. – JohnnyHK

+0

@luttkens: $ elemMatch будет работать. Я изменил свой предыдущий комментарий, пожалуйста, проверьте –

Смежные вопросы