Mongodb-Java: entfernen Sie ein element eines embedded-array innerhalb eines Dokuments auf der Grundlage bestimmter Zustand der Elemente
Habe ich eine Liste der Schüler Dokumente, die die Struktur wie dieser:
{
"_id" : 0,
"name" : "aimee Zank",
"scores" : [
{
"type" : "exam",
"score" : 1.463179736705023
},
{
"type" : "quiz",
"score" : 11.78273309957772
},
{
"type" : "homework",
"score" : 6.676176060654615
},
{
"type" : "homework",
"score" : 35.8740349954354
}
]
}
Wie Sie sehen können, jeder Schüler hat eine Liste von 4 erzielt.
Ich muss entfernen Sie die untersten "Hausaufgaben" und eine Punktzahl für jeden Schüler dokumentieren. Jeder Schüler hat 2 Einträge für "homewok" - Typ-erzielt (die letzten 2 Einträge in dem array von 4 Elementen). Das schema und die Reihenfolge der score-Typ ist konsequent und hat das gleiche Muster für alle Schüler
Ihre Hilfe wird sehr geschätzt.
Dies ist, was ich versucht habe zu erreichen so weit:
DBCursor cursor = collection.find();
try {
while(cursor.hasNext()) {
BasicDBObject doc = (BasicDBObject) cursor.next();
BasicDBList scoreList = (BasicDBList) doc.get("scores");
BasicDBObject hw1 = (BasicDBObject) scoreList.get("2");
double hw1Score = hw1.getDouble("score");
BasicDBObject hw2 = (BasicDBObject) scoreList.get("3");
double hw2Score = hw2.getDouble("score");
if (hw1Score > hw2Score) {
BasicDBObject update = new BasicDBObject("scores.score", hw2Score);
collection.update(doc, new BasicDBObject("$pull",update));
} else {
BasicDBObject update = new BasicDBObject("scores.score", hw1Score);
collection.update(doc, new BasicDBObject("$pull",update));
}
System.out.println(doc);
}
} finally {
cursor.close();
}
}
- Haben Sie versucht alles, um dies zu erreichen? Wenn ja, bitte teilen
- Wahrscheinlich nicht, denn es ist eine bekannte Hausaufgaben-Frage, entlehnt aus university.mongodb.com
- Haben Sie versucht, zu suchen für die niedrigste Punktzahl und
$pull
es? - Sorry, ich sehe nicht, was deine Frage ist. Bitte nicht nur Fragen, "Wie mache ich es?"
- Ich finde nicht die java-Beispiel für das entfernen eines element von einem array basiert auf bestimmten Voraussetzungen der array-Elemente
- Könnt Ihr kommentieren, wenn die Lösung, die ich gab, macht Sinn oder nicht und wenn Sie denken, es könnte besser optimiert. Danke, weiß es zu schätzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß, das ist nicht die beste Lösung (besserer Ansatz ist, um zu Sortieren die Ergebnisse der Hausaufgaben für jedes Dokument und dann begrenzen Sie die array-Größe 3). Aber so funktioniert es auch 🙂
}
versuchen Sie dieses; ich nehme an, die höchste Punktzahl ist 100 :
alle Antworten hier sind Super. Ich wollte nur hinzufügen, dass wenn jemand will, um mit dem Java-Operator (seit Treiber v3.1), dann, anstatt mit den "$ "pull" - operator, er kann so etwas tun:
ich denke, es ist mehr elegant. Also meine Antwort wäre:
Es ist besser, verwenden Sie die Methode, mit
$pull
mit einem filter, um nur zu entfernen, die bestimmten Punktzahl aus dem array. Der code unter Verwendung der MongoDB-Java-Treiber v3.6 mit der Modell-API.Sie Durchlaufen das array und finden Sie die Mindest-Punktzahl. Pseudo-code:
Ich habe versucht, mit native mongodb-Befehle, die ist sehr einfach zu führen. Ich habe versucht, für die gegebene Problemstellung eine getestet.Verwenden Sie die unter 2 Befehle machen, damit es funktioniert.
1) cursor = db.Studenten.aggregate([{ "$unwind": "$erzielt" }, { "$match": { "erzielt.type": "Hausaufgaben"}},{ "$Gruppe": {'_id': '$_id', 'minitem': {'$min':"$erzielt.score"}}}]), null
2) cursor.forEach(function(coll) {db.Studenten.update({'_id': coll._id}, {'$pull': {'erzielt': {'Wert': coll.minitem}}})})
Versuchte ich mit Aggregater Klassen von MongoDB-java-Treiber, um dieses Problem zu lösen. Nachfolgend finden Sie funktionierenden code für Referenz.
Dies ist mein Ansatz, vielleicht hat jemand finden es sauberer und einfacher zu verstehen:
Den
$pull
- operator entfernt aus einem bestehenden array alle Instanzen von einem Wert oder die Werte, die mit einer bestimmten Bedingung.Versuchen, diesen code:
Ich weiß nicht, ob seine ist die beste option, aber Sie funktioniert:
Dies ist mein Ansatz, um dieses problem zu beheben.
Meine Lösung für das obige problem ist :