43

MongoDB 集約フレームワークを使用して配列をアンワインドしていますが、配列に重複があり、さらにグループ化を行う間、それらの重複を無視する必要があります。

どうすればそれを達成できますか?

4

3 に答える 3

28

$addToSet を使用する必要がありますが、最初に _id でグループ化する必要があります。これを行わないと、リスト内のアイテムごとに要素が取得されるためです。

次のようなドキュメントを含むコレクションの投稿を想像してください。

{
     body: "Lorem Ipsum...", 
     tags: ["stuff", "lorem", "lorem"],
     author: "Enrique Coslado"
}

著者ごとの最も一般的なタグを計算したいとします。次のような集計クエリを作成します。

db.posts.aggregate([
    {$project: {
        author: "$author", 
        tags: "$tags", 
        post_id: "$_id"
    }}, 

    {$unwind: "$tags"}, 

    {$group: {
        _id: "$post_id", 
        author: {$first: "$author"}, 
        tags: {$addToSet: "$tags"}
    }}, 

    {$unwind: "$tags"},

    {$group: {
        _id: {
            author: "$author",
            tags: "$tags"
        },
        count: {$sum: 1}
    }}
])

そうすれば、次のようなドキュメントが得られます。

{
     _id: {
         author: "Enrique Coslado", 
         tags: "lorem"
     },
     count: 1
}
于 2014-12-13T14:12:51.673 に答える