【问题标题】:Set project stage keys by values or variables按值或变量设置项目阶段键
【发布时间】:2023-03-22 20:20:01
【问题描述】:

我在数据库中有一个项目。

{ _id: 1, key: 'some_key', value: 'some_value'}

我需要在项目阶段查询中设置聚合框架,如下所示:

Item.aggregate([
  { $project: {
    key: '$value'
  }}
])

得到这个结果:

{_id: 1, some_key: 'some_value'}

有可能吗?

【问题讨论】:

    标签: node.js mongodb aggregation-framework


    【解决方案1】:

    这可以使用聚合管道来完成。

    使用的管道阶段是$addFields$project$replaceRoot

    下面是用来获取结果的查询

     db.a.aggregate([
      {
        $addFields: {
          arr: [
            {
              k: "$key",
              v: "$value"
            }
          ]
        }
      },
      {
        $project: {
          _id: 1,
          newAttrs: {
            $arrayToObject: {
              $map: {
                input: "$arr",
                as: "pair",
                in: [
                  "$$pair.k",
                  "$$pair.v"
                ]
              }
            }
          }
        }
      },
      {
        $replaceRoot: {
          newRoot: {
            $mergeObjects: [
              {
                _id: "$_id"
              },
              "$newAttrs"
            ]
          }
        }
      }
    ]);
    

    使用的样本数据:

    {"_id":1,"key":"some_key","value":"some_value"}
    {"_id":2,"key":"my_key","value":"my_value"}
    {"_id":3,"key":"test_key","value":"test_value"}
    {"_id":4,"key":"new_key","value":"new_value"}
    

    得到的结果:

    {"_id":1,"some_key":"some_value"}
    {"_id":2,"my_key":"my_value"}
    {"_id":3,"test_key":"test_value"}
    {"_id":4,"new_key":"new_value"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2018-04-15
      相关资源
      最近更新 更多