Ich habe unter 3 Dokumente. Jeweils ein Kontakt für einen Benutzer:Gruppierung Mongo-Dokumente mit Elementen der Array-Feld
{
"_id" : ObjectId("57f9f9f3b91d070315273d0d"),
"profileId" : "test",
"displayName" : "duplicateTest",
"email" : [
{
"emailId" : "[email protected]"
},
{
"emailId" : "[email protected]"
},
{
"emailId" : "[email protected]"
}
]
}
{
"_id" : ObjectId("57f9fab2b91d070315273d11"),
"profileId" : "test",
"displayName" : "duplicateTest2",
"email" : [
{
"emailId" : "[email protected]"
}
]
}
{
"_id" : ObjectId("57f9fcefb91d070315273d15"),
"profileId" : "test",
"displayName" : "duplicateTest2",
"email" : [
{
"emailId" : "[email protected]"
}
]
}
ich aggregieren müssen/Gruppe sie von Array-Elementen, so dass ich den doppelten Kontakt (auf E-Mail-ID basiert) identifizieren kann. Da es eine gemeinsame E-Mail-ID zwischen doc (1 & 2) und doc (1 & 3) gibt, repräsentieren diese 3 einen Kontakt und sollten in einem als ein Kontakt zusammengeführt werden.
Ich versuchte dies, wie unten mit zu tun $ entspannen und $ Gruppe in java:
List<DBObject> aggList = new ArrayList<DBObject>();
BasicDBObject dbo = new BasicDBObject("$match", new BasicDBObject("profileId", "0fb72dcf-292b-4343-a0e7-1d613a803b1e"));
aggList.add(dbo);
BasicDBObject dboUnwind = new BasicDBObject("$unwind", "$email");
aggList.add(dboUnwind);
BasicDBObject dboGroup = new BasicDBObject("$group",
new BasicDBObject().append("_id", new BasicDBObject("name", "$email.emailId"))
.append("uniqueIds", new BasicDBObject("$addToSet", "$_id"))
.append("count", new BasicDBObject("$sum", 1)));
aggList.add(dboGroup);
BasicDBObject dboCount = new BasicDBObject("$match", new BasicDBObject("count", new BasicDBObject("$gte", 2)));
aggList.add(dboCount);
BasicDBObject dboSort = new BasicDBObject("$sort", new BasicDBObject("count",-1));
aggList.add(dboSort);
BasicDBObject dboLimit = new BasicDBObject("$limit", 10);
aggList.add(dboLimit);
AggregationOutput output = collection.aggregate(aggList);
System.out.println(output.results());
Diese Gruppen docs per E-Mail-ID (und zu Recht), aber dient nicht dem Zweck.
Jede Hilfe würde sehr geschätzt werden.
Ich muss die Funktion implementieren, wo Benutzer über die möglichen doppelten Kontakte in seinem Repository aufgefordert werden können. Ich brauche Aggregation Ergebnis so etwas wie:
[
{
"_id":{
"name":[
{
"emailId" : "[email protected]"
},
{
"emailId" : "[email protected]"
},
{
"emailId" : "[email protected]"
}
]
},
"uniqueIds":[
{
"$oid":"57f9fcefb91d070315273d15"
},
{
"$oid":"57f9fcefb91d070315273d11"
},
{
"$oid":"57f9fcefb91d070315273d15"
}
],
"count":3
},
Also im Grunde, ich brauche _id für alle möglichen doppelten Kontakte (es könnte wie oben eine andere Gruppe von Duplikaten mit _ids Liste sein), so dass ich es Benutzer auffordern kann und Benutzer kann sie nach seinem Willen zusammenführen. Hoffe es ist jetzt klarer. Vielen Dank!
Sie in einem Dokument zusammengefasst bedeuten Sie? Möchten Sie das Duplikat löschen oder nur das Duplikat identifizieren? – notionquest
Bitte definieren Sie Ihren Zweck klar, denn wenn ich die Aggregation in Ihrem Code zur Verfügung gestellt, funktioniert es in Ordnung. Es gibt neue Dokumente zurück, in denen Profile in 1 zusammengeführt werden. Damit könnten Sie etwas aufräumen oder zusammenführen. So vermisse ich, was Sie vermissen :) – HoefMeistert
@notionquest Ich muss identifizieren und Benutzer zuerst auffordern. Wenn er sich dazu entschließt, das kann ich später machen –