2014-12-02 3 views
1

У меня есть запись MongoDB, которая имеет следующую структуру записи.

{ 
    "_id" : ObjectId("547e29f2421aa9302705679a"), 
    "runs" : [ 
     { 
      "datetime" : "2014-04-2813:18:54.959579", 
      "tag" : "v1.0", 
     }, 
     { 
      "datetime" : "2014-11-1122:45:13.841787", 
      "tag" : "v1.1", 
     } 
    ], 
    "person1" : "person1_id", 
    "person2" : "person2_id" 
} 

Некоторые из моих записей будет иметь более или менее runs, с разными tag. Я пытаюсь сформулировать запрос, который скажет мне, какие записи имеют run с tag=v1.1, но не a run с tag=v1.0.

Я только начинаю изучать MongoDB, но я пришел с запросом:

db.mycollection.find({ $and: [ 
    { runs : { $elemMatch : { tag : 'v1.1' } } }, 
    { runs : { $elemMatch : { $ne: { tag : 'v1.0' } } } }, 
]}) 

однако, это все еще возвращает записи с tag=v1.0. Я не знаю, где я здесь ошибся. Может ли кто-нибудь указать мне правильное направление?

ответ

1

Вам не нужен $elemMatch там, и может вести огонь прямой count(). Используйте $elemMatch, только если вы хотите update или project элемент массива.

db.mycollection.count({$and:[{"runs.tag":"v1.1"}, 
        {"runs.tag":{$not:{"$eq":"v1.0"}}}]}) 

или find()

db.mycollection.find({$and:[{"runs.tag":"v1.1"}, 
        {"runs.tag":{$not:{"$eq":"v1.0"}}}]}) 
+1

Даже лучше, чем решение, которое я разместил. Принято! – Brett

1

Я нашел, используя $not в правильном месте, делает трюк.

db.mycollection.find({ $and: [ 
    { runs : { $elemMatch : { tag : 'v1.1' } } }, 
    { runs : { $not: { $elemMatch : { tag : 'v1.0' } } } }, 
]}).count() 
Смежные вопросы