sql >> Databasteknik >  >> NoSQL >> MongoDB

Filtrera bort dubbletter av arrayer och returnera den unika arrayen 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"
        ]
      }
    }
  }
])

Jag föreslår att du inkluderar andra fält med first ackumulator i group och bevara dem i project .

Du kan förenkla ytterligare enligt nedan

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

Vidare, köp hoppa över en denormalisering, men det returnerar array av arrayer.

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

Om du hoppar över en annan nivå kommer det att lägga till ytterligare en kapslad nivå i resultatet.




  1. Polygon överlappande procent

  2. Automatisera databashälsokontroll

  3. Mongodb klientsida javascript api

  4. Ställ in anpassade omvandlare i Spring Data Mongo