MongoDB: 如何在嵌套文档中通过 id 查找文档
MongoDB: How to find a document by an id inside a nested document
给定这样一个集合:..
[
{
"_id" : ObjectId("5546329a470000850084a621"),
"name": "Joe",
"surname": "Smith",
"accounts": [
{
"_id" : ObjectId("5546329a470000850084a655"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2013-05-03T14:37:15.025Z")
},
{
"_id" : ObjectId("5546329a470000850084a688"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2014-06-03T14:37:15.025Z")
}
]
},
{
"_id" : ObjectId("9546329a470079850084a622"),
"name": "Jimmy",
"surname": "Brown",
"accounts": [
{
"_id" : ObjectId("5546329a470790850084a651"),
"default": true,
"status" : "suspended",
"activationTime" : ISODate("2015-02-03T14:37:15.025Z")
},
{
"_id" : ObjectId("5546329a470019850084a611"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2015-04-03T14:37:15.025Z")
}
]
},
]
...如何通过 accounts.N._id
查找文档?我试过这个...
db.users.find(
{},
{
"accounts": 0, "accounts": {
"$elemMatch": { "_id" : ObjectId("5546329a470019850084a611"), "default": true }
}
}
)
...但它不起作用,因为我只得到所有文档的 _id
:
{ "_id" : ObjectId("5546329a470000850084a621") }
{ "_id" : ObjectId("9546329a470079850084a622") }
我是不是漏掉了什么?
编辑
我实际需要的结果是这样的:
{
"_id" : ObjectId("9546329a470079850084a622"),
"name": "Jimmy",
"surname": "Brown"
}
例如,我需要通过 accounts.N._id
查找但不显示嵌套文档本身。
使用dot notation:
When the field holds an embedded document, a query can either specify
an exact match on the embedded document or specify a match by
individual fields in the embedded document using the dot notation.
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
})
如果您只需要输出数组中有您的 _id 的部分,您需要使用 dollar in projection
The positional $ operator limits the contents of an from the
query results to contain only the first element matching the query
document.
您的查询如下所示:
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
}, {
"accounts.$.": 1
})
P.S. 如果您需要修改后的问题中的输出,请使用:
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
}, {
accounts : 0
})
在条件中使用 $elemMatch
并在项目中使用 $
位置运算符,如下所示:
db.users.find({
"accounts": {
"$elemMatch": {
"_id": ObjectId("5546329a470019850084a611"),
"default": true
}
}
}, {
"accounts.$._id": 1 // "accounts.$": 1 also works
}).pretty()
$elemMatch 运算符将查询结果中的字段内容限制为仅包含与 $elemMatch 条件匹配的第一个元素。
你的情况:
db.users.find({'_id': ObjectId('5546329a470000850084a621')}, {accounts: {$elemMatch: {_id: ObjectId('5546329a470000850084a655')}}})
参考:Mongo Docs
给定这样一个集合:..
[
{
"_id" : ObjectId("5546329a470000850084a621"),
"name": "Joe",
"surname": "Smith",
"accounts": [
{
"_id" : ObjectId("5546329a470000850084a655"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2013-05-03T14:37:15.025Z")
},
{
"_id" : ObjectId("5546329a470000850084a688"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2014-06-03T14:37:15.025Z")
}
]
},
{
"_id" : ObjectId("9546329a470079850084a622"),
"name": "Jimmy",
"surname": "Brown",
"accounts": [
{
"_id" : ObjectId("5546329a470790850084a651"),
"default": true,
"status" : "suspended",
"activationTime" : ISODate("2015-02-03T14:37:15.025Z")
},
{
"_id" : ObjectId("5546329a470019850084a611"),
"default": true,
"status" : "approved",
"activationTime" : ISODate("2015-04-03T14:37:15.025Z")
}
]
},
]
...如何通过 accounts.N._id
查找文档?我试过这个...
db.users.find(
{},
{
"accounts": 0, "accounts": {
"$elemMatch": { "_id" : ObjectId("5546329a470019850084a611"), "default": true }
}
}
)
...但它不起作用,因为我只得到所有文档的 _id
:
{ "_id" : ObjectId("5546329a470000850084a621") }
{ "_id" : ObjectId("9546329a470079850084a622") }
我是不是漏掉了什么?
编辑
我实际需要的结果是这样的:
{
"_id" : ObjectId("9546329a470079850084a622"),
"name": "Jimmy",
"surname": "Brown"
}
例如,我需要通过 accounts.N._id
查找但不显示嵌套文档本身。
使用dot notation:
When the field holds an embedded document, a query can either specify an exact match on the embedded document or specify a match by individual fields in the embedded document using the dot notation.
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
})
如果您只需要输出数组中有您的 _id 的部分,您需要使用 dollar in projection
The positional $ operator limits the contents of an from the query results to contain only the first element matching the query document.
您的查询如下所示:
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
}, {
"accounts.$.": 1
})
P.S. 如果您需要修改后的问题中的输出,请使用:
db.coll.find({
"accounts._id" :ObjectId("5546329a470019850084a611")
}, {
accounts : 0
})
在条件中使用 $elemMatch
并在项目中使用 $
位置运算符,如下所示:
db.users.find({
"accounts": {
"$elemMatch": {
"_id": ObjectId("5546329a470019850084a611"),
"default": true
}
}
}, {
"accounts.$._id": 1 // "accounts.$": 1 also works
}).pretty()
$elemMatch 运算符将查询结果中的字段内容限制为仅包含与 $elemMatch 条件匹配的第一个元素。
你的情况:
db.users.find({'_id': ObjectId('5546329a470000850084a621')}, {accounts: {$elemMatch: {_id: ObjectId('5546329a470000850084a655')}}})
参考:Mongo Docs