Mongodb如何使用$ elemMatch来限制结果

时间:2013-12-24 20:04:09

标签: mongodb mongoose

我的问题是:我的结构类似于:

{
  id: 1,
  participants: [
    { name: "joe", status: 0 },
    { name: "james", status: 2}
  ],
  content: "mongomongo"
}

{
  id: 2,
  participants: [
    { name: "joe", status: 1 },
    { name: "jordan", status: 3}
  ],
  content: "dongodongo"  
}

我想要做的是运行一个与此几乎相同的查询:

db.find({ '_id': { $in: someArray}}, { participants: {$elemMatch: {'name': someName }}}

我会为$ in指定一个对象ID数组,然后我会提供一个用户名。会发生什么事情会让我回复两个对象,但参与者数组只有$ elemMatch找到的条目:

{
  id: 1,
  participants: [
    { name: "joe", status: 0 }
  ]
}

{
  id: 2,
  participants: [
    { name: "joe", status: 1 }
  ]
}

这就是我想要的,但我不想要的部分是它遗漏了其他字段(即content)。如何调整查询,使其仍然返回参与者数组中的一个字段,还返回其他字段,如内容?

提前谢谢!

2 个答案:

答案 0 :(得分:5)

实际上找到了我的问题的解决方案。只需要调整我使用的原始查询。因为我使用Mongoose来管理mongodb交互,所以我混淆了投影字段和选项字段。

以下是有效的查询:

db.find({ '_id': { $in: someArray}}, { participants: {$elemMatch: {'name': someName }}, content: 1, [anything] : 1});

答案 1 :(得分:2)

修改

我误解了原帖和例子。如果您担心返回的唯一其他字段是“内容”,那么您可以将其添加到投影参数中,如下所示:

db.collection.find(
    { 
        '_id': { 
            $in: someArray
        }
    },
    {
        'participants': {
            $elemMatch: {
                'name': someName 
            }
        },
        'content' : 1
    }
)

希望这有帮助!