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"] }
        }
      }
    }
  }}
])

非常感谢您的快速回复。它起作用了。今天我学到了一些新东西。