Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 将具有相似数据的对象分组并使用mongoose重新格式化_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

Mongodb 将具有相似数据的对象分组并使用mongoose重新格式化,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,Javascript将具有相似数据的对象数组分组,并使用mongoose重新格式化 mongoose在聚合项目的数组中获取项 我有一个数组的对象,我想集团产生这个结果 data:[{ user_name: 'Jenny Lawrence', inner_data:[{ "Back Pack":"Black", "produced":"2019", "manu_year":"2019",

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_state和manu_year,但将其他项以其正常格式全部作为数组的对象


如何在mongoose中实现这一点

您需要将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
    }
  }
]);
测试:

参考:

上述查询为所有用户提供了相同的内部_数据结构,以防您仅为Jenny Lawrence需要这种转换的内部_数据结构 &对于其他用户,请使用相同的旧内部\u数据,然后尝试以下操作:

/** 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的聚合框架与某些阶段/运营商结合使用:

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
    }
  }
]);
测试:

参考:

上述查询为所有用户提供了相同的内部_数据结构,以防您仅为Jenny Lawrence需要这种转换的内部_数据结构 &对于其他用户,请使用相同的旧内部\u数据,然后尝试以下操作:

/** 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
    }
  }
])
测试: