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

时间:2018-04-04 06:40:57

标签: mongodb

考虑以下文件:

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

有没有办法返回文档,除了item字段之外没有name的所有属性,如下所示:

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

我想避免编写投影,必须包含所有其他字段{ name: 1, alotofstuff: 1, morestuff: 1, item.name: 1 }(真实文档要大得多)。

2 个答案:

答案 0 :(得分:5)

如果您可以使用Aggregation Pipeline,则可以使用$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阶段作为第一个管道阶段。

答案 1 :(得分:0)

如果您不希望数据库引擎返回其他密钥,则投影只是解决方案。

抱歉!