在MongoDB中排除嵌入文档中除一个字段外的所有字段

3
考虑下面的文档:

以下是一个示例文件:

{
    "_id": 1,
    "name" : "bob",
    "alotofstuff": [],
    "morestuff",
    "item": {
        "name": "baumeister",
        "manyfieldshere": 1,
        "evenmore": 2
    }
}

有没有方法可以返回文档,除了name字段以外,不带有item的所有属性,就像这样:
{
    "_id": 1,
    "name" : "bob",
    "alotofstuff": [],
    "morestuff",
    "item": {
        "name": "baumeister",
    }
}

我希望避免编写需要包含所有其他字段的投影{ name: 1, alotofstuff: 1, morestuff: 1, item.name: 1 }(实际文档要复杂得多)。


为什么不排除那些属性?它们的数量也很大吗? - Muhammad Usman
@UsmanRana 是的,而且甚至有不同种类的项目。 - hansmaad
2个回答

8
如果您可以使用聚合管道, 这里有一个解决方法,可以使用$addFields$project来实现您所要求的功能:
db.your_collection.aggregate([
    { $addFields: { "item_name": "$item.name" } },
    { $project: { item: 0 } },
    { $addFields: { "item.name": "$item_name" } },
    { $project: { item_name: 0 } }
])

这是一个简单的过程,需要创建一个临时的item_name属性,删除item属性,再从临时的item_name中添加item.name属性,最后移除item_name临时属性。我不能声称这是一个干净的解决方案,但它是实用的 - 希望能帮到你。如果你想先过滤文档(我假设你是这样做的),可以将$match阶段作为第一个管道阶段添加。

这是使用addFields和project非常好的例子,对于像我这样懒惰的人来说非常感谢! - Adam91Holt

0

如果您不想让数据库引擎返回其他键,投影是唯一的解决方案。

抱歉!


2
只是为了明确,我不想避免编写投影。我想避免编写非常复杂的投影。我想知道是否有巧妙的方法来解决这个问题。 - hansmaad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接