Znalazłem rozwiązanie, które działa z MongoDB 3.4: I Założę się, że pole z duplikatami nazywa się fieldX
db.collection.aggregate([
{
// only match documents that have this field
// you can omit this stage if you don't have missing fieldX
$match: {"fieldX": {$nin:[null]}}
},
{
$group: { "_id": "$fieldX", "doc" : {"$first": "$$ROOT"}}
},
{
$replaceRoot: { "newRoot": "$doc"}
}
],
{allowDiskUse:true})
Będąc nowicjuszem w mongoDB, spędziłem dużo czasu i wykorzystałem inne długotrwałe rozwiązania, aby znaleźć i usunąć duplikaty. Myślę jednak, że to rozwiązanie jest zgrabne i łatwe do zrozumienia.
Działa przez pierwsze pasujące dokumenty, które zawierają pole X (miałem kilka dokumentów bez tego pola, a otrzymałem jeden dodatkowy pusty wynik).
Następny etap grupuje dokumenty według pólX i wstawia tylko dokument $first w każdej grupie przy użyciu $$ROOT.Na końcu zastępuje całą zagregowaną grupę dokumentem znalezionym za pomocą $ first i $$ ROOT.
Musiałem dodać allowDiskUse, ponieważ moja kolekcja jest duża.
Możesz dodać to po dowolnej liczbie potoków i chociaż dokumentacja dla $ pierwszy wspomina o etapie sortowania przed użyciem $ najpierw, zadziałało to dla mnie bez niego. „Mogliśmy opublikować link tutaj, moja reputacja jest mniej niż 10 :(”
można zapisać wyniki do nowej kolekcji dodając $ na scenie ...
Alternatywnie, jeśli jest tylko zainteresowany w kilku dziedzinach, np pole1, pole2, a nie cały dokument, w fazie grupowej bez replaceRoot:
db.collection.aggregate([
{
// only match documents that have this field
$match: {"fieldX": {$nin:[null]}}
},
{
$group: { "_id": "$fieldX", "field1": {"$first": "$$ROOT.field1"}, "field2": { "$first": "$field2" }}
}
],
{allowDiskUse:true})
Nazwa nie musi być niepowtarzalna. Czy usunie to tylko wtedy, gdy zarówno nazwa, jak i co najmniej jeden węzeł będą takie same? – ewooycom
@ user1188570 Jest to związek, więc oba pola muszą mieć duplikat w tym samym dokumencie. – Sammaye
@Samaye Myślę, że jego lepszym rozwiązaniem do scalania węzłów, czy jest coś takiego jak akcja: {$ scal: węzły} zamiast dropDups? Jak byś to osiągnął? – ewooycom