2012-05-07 50 views
9

我有遊戲集合在我的DB:MongoDB中找到的所有子文件滿足某種條件的文件

var game = { 
    players: [{username:"user1", status:"played"}, 
      {username:"user2", status:"accepted"}] 
} 

據我瞭解這樣的查詢:db.games.find({"players.status":"played"})會給我所有的遊戲,其中至少一個球員有狀態「打球」。我如何才能找到狀態爲「玩」的所有玩家的遊戲?

+0

這裏用一個更靈活的解決方案的討論:HTTP ://stackoverflow.com/questions/11823296/mongodb-find-subdocument-in-array-matching-parameters/11823340#11823340 –

回答

11

如果你只有比「打」,使用查詢另一個身份:

db.games.find({ "players.status": { $ne:"accepted" } }) 

可以調整查詢處理更多的狀態值,只要他們都知道在查詢時。

+1

這就是我做到的。仍然想知道是否有更好的方法,因爲現在我每次添加新的遊戲狀態都必須更改查詢。 – andr111

+1

你可以使你的查詢動態 - 如果你創建一個所有狀態值的數組作爲一個數組,刪除「播放」,並使用它與$ nin(不在)操作它應該工作。 –

+0

謝謝,我想這是我能做到這一點的唯一方法。 – andr111

-1

使用聚合框架的$開卷特點:

db.collection.aggregate([{$開卷: 「$ players.status」},{$比賽:{ 「players.status」:「打「},{$項目:{」 _ ID 「:0,」 players.status「:1}}])

(看看這個答案:https://stackoverflow.com/a/15082321/1214167

+1

不符合OP的要求 - 這隻會返回狀態爲「玩」的玩家 - 問題在於返回所有玩家都玩過的球隊。您可以通過擴展查詢來計算玩過的玩家數量並將其與完整數組的大小進行比較來進行聚合,但這比簡單查找更復雜更慢。 –