sql >> Databáze >  >> NoSQL >> MongoDB

Odfiltrujte duplicitní pole a vraťte jedinečné pole v agregaci mongodb

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

Doporučuji zahrnout další pole pomocí first akumulátor ve group a zachovat je v project .

Můžete dále zjednodušit, jak je uvedeno níže

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

Dále kupte přeskočení jedné denormalizace, ale vrátí pole polí.

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

Pokud přeskočíte další úroveň, přidá se do výsledku ještě jedna vnořená úroveň.




  1. Vytvoří mongodb automaticky index v poli _id vložených dokumentů?

  2. Aktualizace MongoDB MapReduce na místě, jak na to

  3. MongoDB vs MySQL NoSQL - Proč je Mongo lepší

  4. Převeďte MongoDBObject na JsValue