如何在不影响父文档中的字段的情况下包含嵌入文档中的特定字段?
来自此处的Mongo文档:
https://docs.mongodb.com/manual/reference/operator/aggregation/project/#include-嵌入文档中的特定字段
输入:
[
{
_id: 1,
user: "1234",
stop: {
title: "book1",
author: "xyz",
page: 32
}
},
{
_id: 2,
user: "7890",
stop: [
{
title: "book2",
author: "abc",
page: 5
},
{
title: "book3",
author: "ijk",
page: 100
}
]
}
]
您只能选择";标题";嵌入文档的字段:
db.bookmarks.aggregate( [ { $project: { stop: { title: 1 } } } ] )
但这也排除了";用户";父文档中的字段。结果是:
{ "_id" : 1, "stop" : { "title" : "book1" } }
{ "_id" : 2, "stop" : [ { "title" : "book2" }, { "title" : "book3" } ] }
请注意,我不知道父文档中的所有字段,因此无法显式包含它们,也不知道嵌入文档中的全部字段,因此不能显式排除它们。
更新
不幸的是,考虑到领域未知,我不认为有一种非常干净的方法可以实现这一点。
我能得到的最接近的方法是将整个文档也包括在查询中,然后删除原始的";停止";领域这意味着返回的原始根文档数据将在名为"根文档"的字段中;文件";。
我知道这并不完全是你想要的,但它已经尽我所能了。
你也许可以尝试引入CCD_ 1;文件";道具又变成了新的根?
在这里查看实时演示
数据库
[
{
_id: 1,
user: "1234",
stop: {
title: "book1",
author: "xyz",
page: 32
}
},
{
_id: 2,
user: "7890",
stop: [
{
title: "book2",
author: "abc",
page: 5
},
{
title: "book3",
author: "ijk",
page: 100
}
]
}
]
查询
db.collection.aggregate([
{
$project: {
"stop.title": 1,
document: "$$ROOT",
}
},
{
$unset: [
"document.stop"
]
}
])
结果
[
{
"_id": 1,
"document": {
"_id": 1,
"user": "1234"
},
"stop": {
"title": "book1"
}
},
{
"_id": 2,
"document": {
"_id": 2,
"user": "7890"
},
"stop": [
{
"title": "book2"
},
{
"title": "book3"
}
]
}
]
原件
如果我正确理解这一点,那么您应该只需要投影整个stop
字段。
类似于:
查询
db.collection.aggregate([
{
$project: {
stop: 1
}
}
])