排除MongoDB中嵌入文档的所有字段,但不包括单个字段
考虑以下文件:排除MongoDB中嵌入文档的所有字段,但不包括单个字段,mongodb,Mongodb,考虑以下文件: { "_id": 1, "name" : "bob", "alotofstuff": [], "morestuff", "item": { "name": "baumeister", "manyfieldshere": 1, "evenmore": 2 } } 是否有一种方法可以返回文档,除了名称字段外,不包含项的所有属性,如下所示: { "_id": 1, "nam
{
"_id": 1,
"name" : "bob",
"alotofstuff": [],
"morestuff",
"item": {
"name": "baumeister",
"manyfieldshere": 1,
"evenmore": 2
}
}
是否有一种方法可以返回文档,除了名称
字段外,不包含项
的所有属性,如下所示:
{
"_id": 1,
"name" : "bob",
"alotofstuff": [],
"morestuff",
"item": {
"name": "baumeister",
}
}
我想避免编写一个投影,它必须包括所有其他字段
{name:1,alotofstuff:1,morestuff:1,item.name:1}
(实际文档要大得多)。投影是唯一的解决方案,如果您不希望DB引擎返回其他键的话
对不起 如果您不希望DB引擎返回其他键,则投影是唯一的解决方案 对不起 如果您可以使用,这里有一个解决方法,可以满足您的要求,使用和: 这是一个简单的过程,创建一个临时
item\u name
属性,删除item
属性,从临时item\u name
中添加item.name
属性,然后最后删除item\u name
临时属性
我不能说这是一个干净的解决方案,但它是实用的——我希望它能有所帮助。如果您想先过滤文档(我想您可以这样做),可以添加一个阶段作为第一个管道阶段。如果您可以使用,下面是一个解决方法,它将满足您的要求,使用和:
这是一个简单的过程,创建一个临时item\u name
属性,删除item
属性,从临时item\u name
中添加item.name
属性,然后最后删除item\u name
临时属性
我不能说这是一个干净的解决方案,但它是实用的——我希望它能有所帮助。如果您想先过滤文档,可以添加一个stage作为第一个pipeline stage(我想您会这样做)。说清楚一点,我不想避免编写投影。我想避免写一个非常复杂的投影。我在问是否有一种聪明的方法可以做到这一点。我只是想说清楚,我不想避免写投影。我想避免写一个非常复杂的投影。我在问是否有一种聪明的方法可以做到这一点。为什么不排除这些属性呢?它们的数量也很大吗?@UsmanRana是的,甚至还有不同种类的物品。你为什么不排除这些属性?它们的数量也很大吗?@UsmanRana是的,甚至还有不同种类的项目。对于像我这样的懒人来说,这是addFields和project的一个很好的用途。谢谢对于像我这样的懒人来说,这是addFields和project的一个很好的用途。谢谢
db.your_collection.aggregate([
{ $addFields: { "item_name": "$item.name" } },
{ $project: { item: 0 } },
{ $addFields: { "item.name": "$item_name" } },
{ $project: { item_name: 0 } }
])