2014-12-03 82 views
1

我有一個蒙戈文件如下:回到使用MongoDB的db.find()子文檔的子文檔

收集聯賽:

leagues { id = 1, 
    seasons {[ 
    { id: 2008, 
     teams: [ 
     { id: "abcdefghijklmnop1", name: "name01", roster: [{ ... }] }, 
     { id: "abcdefghijklmnopq", name: "name02", roster: [{ ... }] }, 
     { id: "abcdefghijklmnop3", name: "name03", roster: [{ ... }] }, 
     ] 
    }, 
    { id: 2009, 
     teams: [ 
     { id: "abcdefghijklmnop4", name: "name06", roster: [{ ... }] }, 
     { id: "abcdefghijklmnop5", name: "name09", roster: [{ ... }] }, 
     { id: "abcdefghijklmnop6", name: "name12", roster: [{ ... }] }, 
     ] 
    } 
    ] 
}, 
{ id = 2, ... } 

聯賽具有獨特的季節。每個獨特的季節都有一個獨特的「團隊」列表。每個球隊在那個聯盟的那個賽季都有一支獨特的球隊陣容。

這個作品非常適合作爲一個文檔,讓聯盟展示真的很容易,但是真的很難查詢只返回特定聯盟中給定球隊的給定球隊。

使用:

db.leagues.find(
    {"seasons.teams.id":"abcdefghijklmnopq"}, 
    {"seasons": { $elemMatch : { "teams.id" : "abcdefghijklmnopq" }}} 
); 

的偉大工程只返回給定的聯賽單賽季。但是,那個賽季的所有球隊仍然是文件的一部分。

關於如何進一步限制文檔結果只返回特定團隊的任何建議?

編輯:

而且這樣做:

db.leagues.aggregate([ 
    {$unwind: '$seasons'}, 
    {$match: {'seasons.teams.id': 'abcdefghijklmnopq'}}, 
    {$project: {_id: 0, id: '$seasons.teams.id'}} 
]); 

將返回:

{ "id": ["id1...", "id2...", ... "idn..."] } 
+0

'teams.id'在您的示例文檔中不存在。您如何在查詢中使用該字段? – BatScream 2014-12-03 07:38:40

+0

@BatScream Ya。修正了。 – ehsk 2014-12-03 07:47:06

回答

1

假設你的團隊的文檔有一個ID字段爲您彙總/ find操作建議,如:

{ name: "name01",id:abc, roster: [{ ... }] } 

您還需要unwindseasons.teams陣列。

db.leagues.aggregate([ 
{$unwind:"$seasons"}, 
{$match:{"seasons.teams.id":"abcdefghijklmnopq"}}, 
{$unwind:"$seasons.teams"}, 
{$match:{"seasons.teams.id":"abcdefghijklmnopq"}}, 
{$group:{"_id":"$_id","id":{$push:"$seasons.teams.id"}}}, 
{$project:{"_id":0,id:1}} 
]) 
+1

哇。這正是需要的。謝謝!我實際上需要返回整個團隊,所以...... {$ group:{「_ id」:「$ _ id」,「team」:{$ push:「$ seasons.teams」}}},{$ project:{ 「_id」:0,team:1}} ...但是,你。謝謝! – ehsk 2014-12-03 07:45:15