如何在不影响父文档的情况下包含嵌入文档中的特定字段



如何在不影响父文档中的字段的情况下包含嵌入文档中的特定字段?

来自此处的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
}
}
])

最新更新