@elias_steuber
Чтобы удалить повторяющиеся документы из коллекции MongoDB, можно использовать агрегационный фреймворк и операторы $group и $match.
Например, предположим, что у нас есть коллекция "books", в которой есть повторяющиеся документы с одинаковыми значениями поля "title" и "author". Мы можем удалить все повторяющиеся документы, оставив только один из них, выполнив следующие шаги:
- Написать запрос, который сгруппирует документы по значениям полей "title" и "author":
1
2
3
|
db.books.aggregate([
{ $group: { _id: { title: "$title", author: "$author" }}}
])
|
- Добавить оператор $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 }}}
])
|
- Добавить оператор $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 }
])
|
- Использовать оператор $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
2
|
db.books.drop()
db.books_cleaned.renameCollection("books")
|