Существует 2 способа:
Способ MongoDB
Мы выполняем агрегирование MongoDB, где мы группируем записи по full_text
, фильтруем только уникальные документы и вставляем их в коллекцию. (в оболочке)
db.collection.aggregate([
{
$group: {
_id: "$full_text",
data: {
$push: "$$ROOT"
},
count: {
$sum: 1
}
}
},
{
$match: {
count: {
$eq: 1
}
}
},
{
$addFields: {
data: {
$arrayElemAt: [
"$data",
0
]
}
}
},
{
$replaceRoot: {
newRoot: "$data"
}
},
{
$out: "tmp"
}
])
Когда вы выполните этот запрос, он создаст новую коллекцию с уникальными значениями full_text
. Вы можете удалить старую коллекцию и переименовать ее.
Вы также можете поместить название своей коллекции в оператор $out
, например, {$out:"collection"}
, но возврата назад нет .
Python way
Мы выполняем группировку MongoDB по полю full_text
, фильтруем дубликаты документов и создаем единый массив со всеми _id
, которые необходимо удалить. Как только MongoDB возвращает результаты, мы выполняем команду remove
для дубликатов документов.
db.collection.aggregate([
{
$group: {
_id: "$full_text",
data: {
$push: "$_id"
},
count: {
$sum: 1
}
}
},
{
$match: {
count: {
$gt: 1
}
}
},
{
$group: {
_id: null,
data: {
$push: "$data"
}
}
},
{
$addFields: {
data: {
$reduce: {
input: "$data",
initialValue: [],
in: {
$concatArrays: [
"$$value",
"$$this"
]
}
}
}
}
}
])
MongoPlayground
Псевдокод
data = list(collection.aggregate(...))
if len(data) > 0:
colleciton.remove({'_id':{'$in':data[0]["data"]}})