在mongoDB中从Document中获取Document

时间:2013-01-21 01:48:15

标签: mongodb

我有一个名为season的系列,如下所示:

[ 
  { 
    week: 1,
    matchups: [ 
        {
            home : ObjectId("1"),
            away : ObjectId("2")
        },
        {
            home : ObjectId("3"),
            away : ObjectId("4")
        },

    ],
    _id: 50fc50c9ce87149ee3000007 
  },
  { 
    week: 2,
    matchups: [ 
        {
            home : ObjectId("3"),
            away : ObjectId("1")
        },
        {
            home : ObjectId("2"),
            away : ObjectId("4")
        },
    ],
    _id: 50fc50c9ce87149ee3000008 
  }
]

我试图获得主场或客场球队为ObjectId(" 1")的所有比赛。我希望回报看起来像这样:

[ 
  { 
    week: 1,
    matchups: [ 
        {
            home : ObjectId("1"),
            away : ObjectId("2")
        }

    ],
    _id: 50fc50c9ce87149ee3000007 
  },
  { 
    week: 2,
    matchups: [ 
        {
            home : ObjectId("3"),
            away : ObjectId("1")
        }
    ],
    _id: 50fc50c9ce87149ee3000008 
  }
]

是否可以在db.season.find()?

上使用此结果

2 个答案:

答案 0 :(得分:2)

只要您最多可以匹配一个潜在的matchups元素,就可以使用$elemMatch投影运算符来执行此操作:

db.seasons.find(
    {$or: [{'matchups.home': ObjectId("1")},{'matchups.away': ObjectId("1")}]}, 
    {week: 1, matchups: {
        $elemMatch: {$or: [{home: ObjectId("1")},{away: ObjectId("1")}]}
    }});

与Wes关于ObjectId("1")无效的相同警告。

答案 1 :(得分:1)

不是.find,而是.aggregate:

db.seasons.aggregate(
  {$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}}, 
  {$unwind:"$matchups"}, 
  {$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}}, 
  {$group:{_id:"$_id", week:{$first:"$week"}, matchups:{$addToSet:"$matchups"}}});
  1. 首先匹配有您团队成员的过滤器(如果有一些记录不包含您的团队,将使其余部分更有效)
  2. unwind打破了对决
  3. 第二场比赛只对您的球队
  4. 进行过滤
  5. 组再次重建您的记录
  6. 限制是带有聚合的文档大小。希望这会有所帮助。

    你可以做的最好.find是第一场比赛,然后过滤应用程序方面的比赛,AFAIK。

    此外,ObjectId(“1”)无效,仅供参考。