考虑以下文件:
{
"_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 }
(真实文档要大得多)。
答案 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)
如果您不希望数据库引擎返回其他密钥,则投影只是解决方案。
抱歉!