sql >> Database teknologi >  >> NoSQL >> MongoDB

Filtrer duplikerede arrays fra og returner det unikke array i mongodb-aggregation

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"
        ]
      }
    }
  }
])

Jeg foreslår, at du medtager andre felter ved at bruge first akkumulator i group og bevar dem i project .

Du kan forenkle yderligere som nedenfor

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

Yderligere, køb springe en denormalisering over, men det returnerer array af arrays.

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

Hvis du springer et andet niveau over, vil det tilføje endnu et indlejret niveau i resultatet.




  1. Mongodb - skal _id være globalt unik ved sharding

  2. Gruppeopstilling efter afslapning og match

  3. JSON array konvertering til multidimension array

  4. Brug af $push i Array i mongoose