【问题标题】:Group objects with similar data and reformat with mongoose将具有相似数据的对象分组并使用 mongoose 重新格式化
【发布时间】:2020-07-03 12:18:00
【问题描述】:

Javascript 对具有相似数据的对象组数组并使用 mongoose 重新格式化

mongoose 在聚合项目中获取数组中的项目

我有一个对象数组,我想将它们分组以产生这个结果

data:[{
        user_name: 'Jenny Lawrence',
        inner_data:[{
            "Back Pack":"Black",
            "produced":"2019",
            "manu_year":"2019",
            "item_state":"produced",
            "expiration":"unknown"
        },
        {
            other data belonging to jenny lawrence is formated like above
        }]
        "inner_data":{
            "detail":{"personal_item":"Baseball",
                    "manu_year":"2015","item_state":"purchased","color":"White","expiration":"unknown"}}
    }]

这是数据

"data":[
    {"user_name":"Jenny Lawrence", "inner_data":{
        "detail":{"personal_item":"Back Pack","manu_year":"2019","item_state":"produced",
                    "color":"Black","expiration":"unknown"}}},
    {"user_name":"Steven Benjjy",
        "inner_data":{
            "detail":{"personal_item":"Sneakers",
                    "manu_year":"2019","item_state":"purchased","color":"White","expiration":"unknown"}}},
    {"user_name":"Steven Benjjy",
        "inner_data":{
            "detail":{"personal_item":"Baseball",
                    "manu_year":"2018","item_state":"purchased","color":"White","expiration":"unknown"}}},
    {"user_name":"Jenny Lawrence",
        "inner_data":{
            "detail":{"personal_item":"Baseball",
                    "manu_year":"2015","item_state":"purchased","color":"White","expiration":"unknown"}}},
    {"user_name":"Jenny Lawrence",
        "inner_data":{
            "detail":{"personal_item":"iPhone",
                    "manu_year":"2019","item_state":"purchased","color":"White","expiration":"unknown"}}},
    {"user_name":"Daniel Stone",
        "inner_data":{
            "detail":{"personal_item":"Android Phone",
                    "manu_year":"2019","item_state":"purchased","color":"Stone grey","expiration":"unknown"}}},
    {"user_name":"Daniel Stone",
        "inner_data":{
            "detail":{"personal_item":"iPad",
                    "manu_year":"2019","item_state":"refurbished","color":"White","expiration":"unknown"}}}]}

我想按用户名对项目进行分组,并将personal_item中的数据作为名称和颜色的值作为数据/值,并为 item_state 和 manu_year,但将其他的都以正常格式作为数组的对象。

如何在猫鼬中完成这项工作

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您需要将 MongoDB 的聚合框架与某些阶段/运算符一起使用:

    db.collection.aggregate([
      /** group on user_name & push data to inner_data field */
      {
        $group: {
          _id: "$user_name",
          inner_data: {
            $push: {
              /** merge existing 'inner_data.detail' with new fields */
              $mergeObjects: [
                "$inner_data.detail",
                {
                  /** As certain fields are being formed as an array, convert those to k:v pairs */
                  $arrayToObject: [
                    [
                      {
                        k: "$inner_data.detail.personal_item",
                        v: "$inner_data.detail.color"
                      },
                      {
                        k: "$inner_data.detail.item_state",
                        v: "$inner_data.detail.manu_year"
                      }
                    ]
                  ]
                }
              ]
            }
          }
        }
      },
      /** Optional, but this stage can be helpful to remove unnecessary fields */
      {
        $project: {
          "inner_data.color": 0,
          "inner_data.personal_item": 0
        }
      }
    ]);
    

    测试: MongoDB-Playground

    参考: $mergeObjects , $arrayToObject

    以上查询为所有用户提供了相同的 inner_data 结构,以防您只需要 Jenny Lawrence 的那种转换后的 inner_data 结构 & 其他用户使用相同的旧 inner_data 然后试试这个:

    /** All the difference it brings is conditional check before push */
    db.collection.aggregate([
      {
        $group: {
          _id: "$user_name",
          inner_data: {
            $push: {
              $cond: [
                {
                  $eq: [
                    "$user_name",
                    "Jenny Lawrence"
                  ]
                },
                {
                  $mergeObjects: [
                    "$inner_data.detail",
                    {
                      $arrayToObject: [
                        [
                          {
                            k: "$inner_data.detail.personal_item",
                            v: "$inner_data.detail.color"
                          },
                          {
                            k: "$inner_data.detail.item_state",
                            v: "$inner_data.detail.manu_year"
                          }
                        ]
                      ]
                    }
                  ]
                },
                "$inner_data"
              ]
            }
          }
        }
      },
      {
        $project: {
          "inner_data.color": 0,
          "inner_data.personal_item": 0
        }
      }
    ])
    

    测试: MongoDB-Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2021-03-05
      • 2015-01-12
      相关资源
      最近更新 更多