MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Filtern Sie doppelte Arrays heraus und geben Sie das eindeutige Array in der Mongodb-Aggregation zurück

db.collection.aggregate([
  {//Denormalize first level
    "$unwind": "$newList"
  },
  {//Second nested level
    "$unwind": "$newList.newPMBList"
  },
  {//Deep nested last level
    "$unwind": "$newList.newPMBList.newPMList"
  },
  {
    $group: {//Grouping back
      "_id": null,
      "newList": {
        $push: "$newList.newPMBList.newPMList"
      }
    }
  },
  {
    $project: {//Finding unique
      newList: {
        $setUnion: [
          "$newList",
          "$newList"
        ]
      }
    }
  }
])

Ich schlage vor, dass Sie andere Felder mit first einschließen Akkumulator in group und bewahren Sie sie in project auf .

Sie können wie folgt weiter vereinfachen

db.test.aggregate([
  {
    "$unwind": "$newList"
  },
  {
    "$unwind": "$newList.newPMBList"
  },
  {
    "$unwind": "$newList.newPMBList.newPMList"
  },
  {
    $group: {
      "_id": null,
      "newList": {//addToSet keeps distinct
        $addToSet: "$newList.newPMBList.newPMList"
      }
    }
  }
])

Kaufen Sie außerdem das Überspringen einer Denormalisierung, aber es gibt ein Array von Arrays zurück.

db.test.aggregate([
  {
    "$unwind": "$newList"
  },
  {
    "$unwind": "$newList.newPMBList"
  },
  {
    $group: {
      "_id": null,
      "newList": {
        $addToSet: "$newList.newPMBList.newPMList"
      }
    }
  }
])

Wenn Sie eine weitere Ebene überspringen, wird dem Ergebnis eine weitere verschachtelte Ebene hinzugefügt.