Mongodb动态聚合项目
我有我的结构收藏Mongodb动态聚合项目,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有我的结构收藏 { a: 1, b: 2, c: 3, d: 4, e: 5, allowed: ['a', 'b'] } 在此集合中,允许的数组存储要提取的字段名。它由用户希望获取的首选项设置,可以更改这些选定字段,并在允许的数组中更新 我想以某种方式使用MongoDB聚合和项目获取允许的数组 无需手动列出$project中的所有字段 {$project:{a:1,b:1}} 我有一个解决方案,比如在聚合中使用下面的项目 db.getCollection("d
{
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
allowed: ['a', 'b']
}
在此集合中,允许的数组存储要提取的字段名。它由用户希望获取的首选项设置,可以更改这些选定字段,并在允许的数组中更新
我想以某种方式使用MongoDB聚合和项目获取允许的数组
无需手动列出$project中的所有字段
{$project:{a:1,b:1}}
我有一个解决方案,比如在聚合中使用下面的项目
db.getCollection("dummy").aggregate([
{ $match: {} },
{
$project: {
a: {
$cond: {
if: { $in: ["a", "$allowed"] },
then: "$a",
else: "$$REMOVE",
},
},
b: {
$cond: {
if: { $in: ["b", "$allowed"] },
then: "$b",
else: "$$REMOVE",
},
},
},
},
]);
但这也需要列出所有字段。我正在寻找另一种解决方案,即在允许的数组中投影字段,而不在$project中手动列出所有字段。由于您不知道文档中的字段是什么,因此必须使用将它们转换为
k
-v
对,然后使用筛选出不在$allowed
数组中的字段。最后使用以获得初始形状
db.collection.aggregate([
{ $replaceRoot: {
newRoot: {
$arrayToObject: {
$filter: {
input: { $objectToArray: "$$ROOT" },
cond: { $in: ["$$this.k", "$allowed"] }
}
}
}
}}
])
非常感谢您的快速回复。它起作用了。今天我学到了一些新东西。