2013-09-14 4 views
35

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

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

+0

HI andrewrk Пожалуйста, вы можете поделиться схемы для выше вопрос и ответ –

ответ

39

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

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

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

+0

я подумал о том, что , Я могу расслабиться, добавить и снова расслабиться. Но хотелось посмотреть, могу ли я по-другому. Благодарю. –

+2

вы можете просто группировать по элементу id и массиву (без добавления в набор), не могу сказать больше без вашего запроса –

21

Вы должны использовать $ 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 
} 
+0

Отличный ответ, я бы просто добавил '{$ sort: {count: -1}}' как последний этап трубопровода для сортировки. – Diego

Смежные вопросы