2014-12-02 230 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" 
} 

我的一些記錄將有一個不同的tag或多或少runs,每個。我想制定一個查詢,告訴我哪些記錄有runtag=v1.1不是 a runtag=v1.0

我剛開始學的MongoDB,但我已經拿出查詢:

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

然而,這仍然返回記錄與tag=v1.0。我不確定我在哪裏錯了。 任何人都可以指出我正確的方向嗎?

回答

1

你不需要$elemMatch那裏,可以發射直接count()。僅當您想要updateproject數組元素時才使用$elemMatch

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 2014-12-02 23:34:24

1

我發現在正確的地方使用$not的伎倆。

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