MongoDB:查询和检索嵌入式数组中的对象?

neb*_*ebs 19 arrays mongodb

假设我在名为"users"的集合中有以下文档架构:

{
    name: 'John',
    items: [ {}, {}, {}, ... ]
}
Run Code Online (Sandbox Code Playgroud)

'items'数组包含以下格式的对象:

{
    item_id: "1234",
    name: "some item"
}
Run Code Online (Sandbox Code Playgroud)

每个用户可以在"项目"数组中嵌入多个项目.

现在,我希望能够通过item_id为给定用户获取项目.

例如,我想获取属于名为"John"的用户的ID为"1234"的项目.

我可以用mongoDB做到这一点吗?我想利用它强大的数组索引,但我不确定你是否可以在嵌入式数组上运行查询并从数组中返回对象而不是包含它的文档.

我知道我可以使用{users.items.item_id:"1234"}来获取拥有某个项目的用户.但我想从数组中获取实际项目,而不是用户.

或者,是否有更好的方法来组织这些数据,以便我可以轻松地得到我想要的东西?我仍然是mongodb的新手.

感谢您提供的任何帮助或建议.

小智 28

问题是陈旧的,但自那时以来,反应已经发生了变化.使用MongoDB> = 2.2,您可以:

db.users.find( { name: "John"}, { items: { $elemMatch: { item_id: "1234" } } })
Run Code Online (Sandbox Code Playgroud)

你将会有 :

{
   name: "John",
   items: 
   [ 
       {
         item_id: "1234",
         name: "some item"
       }
   ]
}
Run Code Online (Sandbox Code Playgroud)

请参阅$ elemMatch的文档

  • 这是OP问题的最佳答案,我希望他能看到并改变它,否则许多人会看到已接受的答案,并认为没有两个集合就没有解决方案. (2认同)

Wil*_*m Z 7

关于此,有几点需要注意:

1)我发现学习MongoDB的人最难的事情是联合学习他们习惯的关系思维.您的数据模型看起来是正确的.

2)通常,您使用MongoDB执行的操作是将整个文档返回到客户端程序,然后使用客户端编程语言在客户端上搜索所需文档的一部分.

在您的示例中,您将获取整个"用户"文档,然后遍历客户端上的"items []"数组.

3)如果只想返回'items []'数组,可以使用'Field Selection'语法.有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Querying#Querying-FieldSelection.不幸的是,它将返回整个'items []'数组,而不仅仅是数组的一个元素.

4)现有的Jira票证可以添加此功能:https: //jira.mongodb.org/browse/SERVER-828 SERVER-828.看起来它已被添加到最新的2.1(开发)分支中:这意味着它将在2.2版本发布时可用于生产.