2016-02-25 10 views

Odpowiedz

6

Musimy tylko grupować na podstawie 2 kluczy i wybrać elementy z liczbą większą niż 1, aby znaleźć duplikaty.

Zapytanie: - Będzie jak

db.mycollection.aggregate(
    { $group: { 
     _id: { foreing: "$foreing", value: "$value" }, 
     count: { $sum: 1 }, 
     docs: { $push: "$_id" } 
    }}, 
    { $match: { 
     count: { $gt : 1 } 
    }} 
) 

WYJŚCIE: - Będzie jak

{ 
    "result" : [ 
     { 
      "_id" : { 
       "foreing" : 1, 
       "value" : 2 
      }, 
      "count" : 2, 
      "docs" : [ 
       ObjectId("34567887654345678987"), 
       ObjectId("34567887654345678987") 
      ] 
     } 
    ], 
    "ok" : 1 
} 

LINK: - How to find mongo documents with a same field

9

można łatwo zidentyfikować duplikatów przez uruchomienie następującej operacji potoku agregacji:

db.collection.aggregate([ 
    { 
     "$group": { 
      "_id": { "foreing": "$foreing", "value": "$value" }, 
      "uniqueIds": { "$addToSet": "$_id" }, 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$match": { "count": { "$gt": 1 } } } 
]) 

$group operatora w pierwszym etapie stosuje się grupy dokumentów przez wartości kluczy foreign i value a następnie utworzyć tablicę _id wartości dla każdego ze zgrupowanych dokumentach w dziedzinie uniqueIds stosując $addToSet operator. Daje to tablicę unikatowych wartości wyrażenia dla każdej grupy. Uzyskaj łączną liczbę zgrupowanych dokumentów, które będą używane w późniejszych etapach potoku za pomocą operatora .

W drugim etapie rurociągu użyć operatora $match odfiltrować wszystkie dokumenty zliczanie 1. odfiltrowanym Dokumenty są unikalne klucze indeksu.

Pozostałe dokumenty będą tymi z kolekcji, które mają zduplikowane wartości klucza dla pary foreing & value.

Powiązane problemy