2013-03-15 19 views
29

Ich benutze Mongo 2.2.3 und den Java-Treiber. Mein Dilemma, ich muss ein Feld und Wert in ein Array schieben, aber ich kann nicht herausfinden, wie dies zu tun ist. Eine Probe meiner Daten:

"_id" : 1, 
"scores" : [ 
    { 
     "type" : "homework", 
     "score" : 78.97979 
    }, 
    { 
     "type" : "homework", 
     "score" : 6.99 
    }, 
    { 
     "type" : "quiz", 
     "score" : 99 
    } 
] 

kann ich $ Push in der Schale:

db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}}) 

aber es ist, wenn ich das in Java übersetze ich mich selbst verwirren und Futter meine Tastatur an einer Wand.

mein Java-Code (unvollständig und falsch) so weit:

DBObject find = new BasicDBObject("_id", 1); 
DBObject push = new BasicDBObject("$push", new BasicDBObject(
         "scores", new BasicDBObject())); 
+1

upvoted für das Chuck meine Tastatur an einer Wand Teil lol. –

Antwort

31
DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99)); 
DBObject updateQuery = new BasicDBObject("$push", listItem); 
myCol.update(findQuery, updateQuery); 
+0

danke! genau das was ich gesucht habe. Ich habe etwas ähnliches versucht, aber ich denke, ich habe .append an der falschen Stelle. –

+0

Ich versuche das Beispiel, aber es erlaubt mir nicht, "update" zu verwenden .. fragt mich stattdessen nach "updateone" mit dem Objekt collections. – user2189668

+1

Es ist nicht möglich, 'update' zu verwenden! Was ist der Grund?! –

11

Wenn Sie mehr comforable mit dem Abfrage-Format der Schale sind, können Sie finden es einfacher ist, JSON.parse zu verwenden, um contstruct Ihre DBObject für die $push:

import com.mongodb.util.JSON; 

String json = "{$push:{scores:{type:'quiz', score:99}}}"; 
DBObject push = (DBObject) JSON.parse(json); 
+0

sehr netter Herr! Es ist wie Jongo-Syntax. Ich wünschte wirklich, ich könnte beide Antworten akzeptieren! –

+0

Great Thanks Kumpel – nifCody

6

Mit Jongo können Sie as in the shell tun:

db.collection.update({_id:1},{$push:{scores:{type:"quiz", score:99}}}) 

Wird in Java:

collection.update("{_id:1}").with("{$push:{scores:{type:#, score:#}}}", "quiz", 99); 

Keine Lust DBObject ;-) benötigt

9

Seit mongodb-driver 3.1. gibt es eine Builder-Klasse com.mongodb.client.model.Updates mit geeigneten Methoden für jedes Update Fall. In diesem Fall wäre das:

Document score = new Document().append("type", "quiz") 
           .append("score",99); 

collection.updateOne(eq("_id", "1"),Updates.addToSet("scores", score)); 
+0

Dies ist viel zu gering geschätzt! Der neue Treiber ist so viel intuitiver. – KeksArmee