bugfix> mongodb > 投稿

mongodbには、次のようなデータ構造があります。

{
    "data" : [ 
        {
            "car" : [ 
                {
                    "model" : "aaa",
                }, 
                {
                    "model" : "bbb",
                }, 
                {
                    "model" : "ccc",
                }
            ],
            "user" : {
                "id" : "123"
            }
        }
    ],
}

そして、車のモデルフィールドをグループ化してカウントしたいと思います。そこで、最初に次のようなアンワインド方法を試しました。

.aggregate([
  { $project: {"data.car.model":1, "data.user.id":1} },
  { $unwind: {
      path: "$data.car",
      preserveNullAndEmptyArrays: true
      } },
  { $group: {
      _id: "$data.car.model",
      count: { $sum: 1 }
      } }
])

しかし、結果は次のとおりです。

{
    "_id" : [ ["aaa", "bbb", "ccc"] ],
    "count" : 1.0
}

モデルが解けなかったので、私は望んでいませんでした。私が期待している結果は次のとおりです。

[{_id:"aaa",count:1}, {_id:"bbb",count:1}, {_id:"ccc", count:1}]

次に見た mongodbはドキュメントの配列内にネストされた配列を巻き戻します、ネストされた配列$projectを試しました。

.aggregate([
  { $project: {"car":"$data.car.model", "user":"$data.user.id"} },
])

しかし、結果は次のとおりです。

{
    "car" : [ ["aaa", "bbb", "ccc"] ],
    "user" : ["123"]
}

ご覧のとおり、車とユーザーは配列に埋め込まれており、$unwindメソッドを適用することはできません。ただし、次のようにする必要があります。

{
    "car" : ["aaa", "bbb", "ccc"],
    "user" : "123"
}

私が使用しているmongoは3.2です。ウェブ上でよく検索しましたが、答えが見つかりませんでした。そうすることは可能ですか?

回答 1 件
  • あなたは $unwind する必要があります  "各" 独立した配列:

    .aggregate([
      { "$unwind": { "path": "$data", "preserveNullAndEmptyArrays": true } },
      { "$unwind": { "path": "$data.car", "preserveNullAndEmptyArrays": true } },
      { "$group": {
        "_id": "$data.car.model",
        "count": { "$sum": 1 }
      }}
    ])
    
    

    実際に「手を伸ばす」ことはできませんし、 $unwind  あなたが試みたように。したがって、最初に外側の配列を「ラップ解除」し、次に「内側」の配列を開きます。次に、ドキュメントはグループ化のためにフラット化されます。

    別のアプローチは、 $reduce を使用することです  「巻き戻し」の前に「配列を平坦化する」:

    .aggregate([
      { "$project": {
        "data": {
          "$reduce": {
            "input": "$data.car",
            "initialValue": [],
            "in": {
              "$concatArrays": [ "$$value", "$$this" ]
            }
          }
        }
      }},
      { "$unwind": "$data" },
      { "$group": {
        "_id": "$data.model",
        "count": { "$sum": 1 }
      }}
    ])
    
    

    しかし、「投影」には $unwind を使用することで発生するよりも高いコストがかかる可能性が高いため、実際には推奨されません。  配列内のネストの各レベルに対して。

あなたの答え