MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Филтриране на дублиращи се масиви и връщане на уникалния масив в агрегирането на 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"
        ]
      }
    }
  }
])

Предлагам ви да включите други полета, като използвате first акумулатор в group и ги запазете в project .

Можете да опростите допълнително, както е показано по-долу

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

Освен това купете пропускане на една денормализация, но връща масив от масиви.

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

Ако пропуснете друго ниво, това ще добави още едно вложено ниво в резултата.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB получи поддокумент

  2. Не е възможно да се заключи mongodb документ. Ами ако трябва?

  3. Неуспешно намиране на източник на данни:com.mongodb.spark.sql.DefaultSource

  4. Новият начин за управление на бази данни с отворен код

  5. Актуализиране на вложен масив с MongoDB