使用Mongodb的db.find()返回子文档的子文档

时间:2014-12-03 07:19:55

标签: mongodb aggregation-framework

我有一份mongo文件如下:

收集是联盟:

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..."] }

1 个答案:

答案 0 :(得分:1)

假设您的团队文档有一个id字段作为您的聚合/查找操作建议,例如:

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

您还需要unwind seasons.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}}
])