Подтвердить что ты не робот

MongoDB - размотать массив, используя агрегацию и удалить дубликаты

Я разворачиваю массив, используя структуру агрегации MongoDB, и массив имеет дубликаты, и мне нужно игнорировать эти дубликаты при дальнейшем группировании.

Как я могу это достичь?

4b9b3361

Ответ 1

вы можете использовать $addToSet, чтобы сделать это:

db.users.aggregate([
  { $unwind: '$data' },
  { $group: { _id: '$_id', data: { $addToSet: '$data' } } }
]);

Трудно дать вам более конкретный ответ, не видя ваш фактический запрос.

Ответ 2

Вам нужно использовать $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
}