【问题标题】:How to convert Mongo query array result into flatten object and key should be _id如何将 Mongo 查询数组结果转换为展平对象,键应为 _id
【发布时间】:2022-01-25 19:59:11
【问题描述】:

如何将 mongo 查询结果转换为扁平对象。

当前结果:

[
  {
    "_id": "61ef7e5497c9912ac1e56404",
    "name": "Mark",
    "age": 20,
    "isMinor": true
  },
  {
    "_id": "61ef7e5497c9912ac1e56404",
    "name": "Sam",
    "age": 22,
    "isMinor": false
  }
]

异常输出:

[
  {
    "61ef7e5497c9912ac1e56404": {
      "_id": "61ef7e5497c9912ac1e56404",
      "name": "Mark",
      "age": 20,
      "isMinor": true
    },
    "61ef7e5497c9912ac1e56404": {
      "_id": "61ef7e5497c9912ac1e56404",
      "name": "Sam",
      "age": 22,
      "isMinor": false
    }
  }
]

我想使用聚合查询本身来做到这一点。

我当前的查询:

Users.aggregate({$addField:{isMinor:{ $cond: [
                    { $gt: ['$age', 20] },
                    true, false,
                  ]}}})

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:
    1. $group - 对文档进行分组并添加 users 字段,该字段包含键值对(键:id,值:文档)数组。此阶段将仅返回一个文档。
    2. $replaceWith - 用指定的文档替换输入文档。此阶段将以键值对的形式输出文档。
    db.collection.aggregate([
      // Previous stages
      {
        $group: {
          _id: null,
          users: {
            $push: {
              k: { $toString: "$_id" },
              v: "$$ROOT"
            }
          }
        }
      },
      {
        "$replaceWith": {
          $arrayToObject: "$users"
        }
      }
    ])
    

    Sample Mongo Playground

    【讨论】:

    • 谢谢,@yong。实时执行只有一个很小的变化。 k: { $toString: '$_id' }。 _id 需要转换为字符串,因为 arrayToObject 不会将对象类型值转换为键。
    • 是的,密钥必须是字符串。别客气。 =)
    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2016-12-23
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多