假设我在一个名为"用户"的集合中有以下文档模式:

{
    name: 'John',
    items: [ {}, {}, {}, ... ]
}

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

{
    item_id: "1234",
    name: "some item"
}

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

现在,我希望能够通过给定用户的item_id获取一个item.

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

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

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

或者,是否有更好的方法来组织这些数据,以便我可以轻松地得到我想要的?我对mongodb还是相当陌生的.

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

推荐答案

The question is old, but the response has changed since the time. With MongoDB >= 2.2, you can do :

db.users.find( { name: "John"}, { items: { $elemMatch: { item_id: "1234" } } })

你将有:

{
   name: "John",
   items: 
   [ 
       {
         item_id: "1234",
         name: "some item"
       }
   ]
}

See Documentation of $elemMatch

Mongodb相关问答推荐

用Spring Boot查询MongoDB中的对象数组

在提供的文档(_Id)之后和之前,是否有一个Mongo操作来获取已排序(和/或过滤)集合中的文档计数?

如何使用聚合管道查找未销售但存在于产品详细信息集合中的产品的ID

我可以在 MongoDB 中将字段值设置为对象键吗?

MongoDB - 家庭作业(job)帮助.不确定如何在 mongodb 中访问文档中的变量

MongoDB:嵌套数组计数+原始文档

$group 和 sum + 添加所有大于

TypeError:Cannot read property '_id' of undefined

MongoDB 的 Java 语法

使用 EventSourcing(NodeJS、MongoDB、JSON)跨多个偶尔连接的客户端同步数据

Mongoid 有 Map/Reduce 吗?

Meteor 如何接收对 MongoDB 查询结果的更新?

MongoDB 的 BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=") 中的0是什么意思?

如何在 MongoDb 中使用杰克逊将日期字段存储为 ISODate()

mongodb无法启动

Mongoose 不创建新集合

在 Ubuntu 13.10 (saucy) 中安装 Mongodb PHP 扩展的最简单方法?

错误:需要数据和盐参数

用 MongoDB 中的属性表示多对多关系的最佳模型

开发人员必须采取哪些mental steps才能开始从 SQL 迁移到 NOSQL(CouchDB、Fathom DB、MongoDB 等)?