Как удалить повторяющиеся документы из коллекции MongoDB?

Пользователь

от elias_steuber , в категории: Компьютерные технологии , год назад

Как удалить повторяющиеся документы из коллекции MongoDB?

Facebook Vk Ok Twitter Telegram Whatsapp

1 ответ

Пользователь

от verla , год назад

@elias_steuber 

Чтобы удалить повторяющиеся документы из коллекции MongoDB, можно использовать агрегационный фреймворк и операторы $group и $match.


Например, предположим, что у нас есть коллекция "books", в которой есть повторяющиеся документы с одинаковыми значениями поля "title" и "author". Мы можем удалить все повторяющиеся документы, оставив только один из них, выполнив следующие шаги:

  1. Написать запрос, который сгруппирует документы по значениям полей "title" и "author":
1
2
3
db.books.aggregate([
   { $group: { _id: { title: "$title", author: "$author" }}}
])


  1. Добавить оператор $match, чтобы выбрать только те группы, которые содержат более одного документа:
1
2
3
4
db.books.aggregate([
   { $group: { _id: { title: "$title", author: "$author" }}},
   { $match: { "_id.title": { $ne: null }, "_id.author": { $ne: null }, "count": { $gt: 1 }}}
])


  1. Добавить оператор $limit, чтобы оставить только один документ из каждой группы:
1
2
3
4
5
db.books.aggregate([
   { $group: { _id: { title: "$title", author: "$author" }, count: { $sum: 1 }}},
   { $match: { "_id.title": { $ne: null }, "_id.author": { $ne: null }, "count": { $gt: 1 }}},
   { $limit: 1 }
])


  1. Использовать оператор $out, чтобы сохранить полученный результат в новую коллекцию:
1
2
3
4
5
6
db.books.aggregate([
   { $group: { _id: { title: "$title", author: "$author" }, count: { $sum: 1 }}},
   { $match: { "_id.title": { $ne: null }, "_id.author": { $ne: null }, "count": { $gt: 1 }}},
   { $limit: 1 },
   { $out: "books_cleaned" }
])


  1. Удалить старую коллекцию и переименовать новую:
1
2
db.books.drop()
db.books_cleaned.renameCollection("books")