首页 > 解决方案 > 如何在一个数组中有多个嵌套数组

问题描述

我从带有标题的 csv 文件中收集数据。当我运行我的查询

db.ties.aggregate(
   [
     {
       $group:
         {
           _id: { "SHOP": "$SHOP" },
           isLinkedTo: { $push: { "PERSON": "$PERSON", "CITY": "$CITY", "ROOM": "$ROOM", "STYLE": "$STYLE", "hasDonated": {"DATE": "$DATE", "OBJECT": "$OBJECT", "COST": "$COST", "COLOR": "$COLOR", "PAYMENT": "$PAYMENT"}}}
         }
     },
     { $out: "ties"}
   ],
   { allowDiskUse: true }
)

我有类似的结果:

{
        "_id": {
            "Shop": "FirstShopNameCovered"
        },
        "isLinkedTo": [{
            "PERSON": "Carleen",
            "CITY": "Rome",
            "ROOM": "Kitchen",
            "STYLEPREFERED": "Modern",
            "hasDonated": {
                "DATE": "2019-10-11",
                "OBJECT": "Set of dishes",
                "COST": 72,
                "COLOR": "White",
                "PAYMENT": "Credit card"
            }
        }, {
            "PERSON": "Carleen",
            "CITY": "Rome",
            "ROOM": "Kitcher",
            "STYLEPREFERED": "Modern",
            "hasDonated": {
                "DATE": "2018-10-26",
                "OBJECT": "Set of chairs",
                "COST": 353,
                "COLOR": "Grey",
                "PAYMENT": "Coupon"
            }
        }, {
            "PERSON": "Pernick",
            "CITY": "Venezia",
            "ROOM": "Bathroom",
            "STYLE": "Minimalist",
            "hasDonated": {
                "DATE": "2018-09-18",
                "OBJECT": "Mirror",
                "COST": 68,
                "COLOR": "Brown",
                "PAYMENT": "Credit card"
            }
        }

您可以看到复制了 Person "PERSON": "Carleen",其中包含 2 个不同数组hasDonated的所有数据。

我希望有这样的结果,没有复制的人包含他所在的所有hasDonated数组:

    "_id": {
        "Shop": "NameCovered"
    },
    "isLinkedTo": [{
        "PERSON": "Carleen",
        "CITY": "Rome",
        "ROOM": "Kitchen",
        "STYLE": "Retrò",
        "hasDonated": {
            "DATE": "2019-10-11",
            "OBJECT": "Set of dishes",
            "COST": 72,
            "COLOR": "White",
            "PAYMENT": "Credit card"
        },
        {
            "DATE": "2018-10-26",
            "OBJECT": "Chair",
            "COST": 53,
            "COLOR": "Grey",
            "PAYMENT": "Coupon"
        }
    }, {
        "PERSON": "Pernick",
        "CITY": "Venezia",
        "ROOM": "Bathroom",
        "STYLE": "Minimalist",
        "hasDonated": {
            "DATE": "2018-09-18",
            "OBJECT": "Mirror",
            "COST": 68,
            "COLOR": "Brown",
            "PAYMENT": "Credit card"
        }

我该怎么做才能得到这样的结果?

标签: mongodbmongodb-query

解决方案


首先,我们需要$unwind展平阵列。然后,如您所提到的,通过“_id”和“PERSON”的组合找到唯一的hasDonated使用分组。$group

[
  {
    "$unwind": "$isLinkedTo"
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        per: "$isLinkedTo.PERSON"
      },
      isLinkedTo: {
        $first: {
          PERSON: "$isLinkedTo.PERSON",
          CITY: "$isLinkedTo.CITY",
          ROOM: "$isLinkedTo.ROOM",
          STYLEPREFERED: "$isLinkedTo.STYLEPREFERED"
        }
      },
      hasDonated: {
        $addToSet: "$isLinkedTo.hasDonated"
      }
    }
  },
  {
    $addFields: {
      _id: "$_id._id",
      "isLinkedTo.hasDonated": "$hasDonated"
    }
  },
  {
    $project: {
      hasDonated: 0
    }
  },
  {
    $group: {
      _id: "$_id",
      isLinkedTo: {
        $push: "$isLinkedTo"
      }
    }
  }
]

工作Mongo游乐场


推荐阅读