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

    さらに、1つの非正規化をスキップして購入しますが、配列の配列を返します。

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

    別のレベルをスキップすると、結果にネストされたレベルがもう1つ追加されます。




    1. 方法-単一のMongoDB上の複数のMeteorアプリ-同じコレクション?

    2. ループバッククエリにリモートメソッドを含める

    3. 多くの親との多くの自己参照関係をモデル化する方法は?

    4. RedisとMongoDB