2013-03-15 15 views
29

Sto utilizzando mongo 2.2.3 e il driver java. Il mio dilemma, devo spingere un campo e un valore in un array, ma non riesco a capire come farlo. Un campione dei miei dati:

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

posso $ spingere nella shell:

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

ma è quando traduco questo in Java confondo la mia auto e Chuck mia tastiera a un muro.

il mio codice Java (incompleta e sbagliata) finora:

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

suvato per il chuck la mia tastiera a un muro parte lol. –

risposta

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

grazie! esattamente quello che stavo cercando. ho provato qualcosa di simile ma penso di averlo inserito nel posto sbagliato. –

+0

sto provando l'esempio ma non mi permette di usare "update" .. mi chiede invece "updateone" con oggetto collections .. – user2189668

+1

Non è possibile usare 'update'! Per quale motivo?! –

11

Se siete più comforable con il formato di query del guscio, si può trovare è più facile da usare JSON.parse per contstruct tua DBObject per il $push:

import com.mongodb.util.JSON; 

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

signore molto gentile! è come la sintassi jongo. vorrei davvero poter accettare entrambe le risposte! –

+0

Great Thanks buddy – nifCody

6

Utilizzando Jongo, si può fare as in the shell:

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

Diventa in Java:

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

No fantasia DBOBJECT necessario ;-)

9

Dal mongodb-driver 3.1. v'è un costruttore di classe com.mongodb.client.model.Updates con metodi appropriati per ciascun caso di aggiornamento. In questo caso questo sarebbe il seguente:

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

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

Questo è molto sottovalutato! Il nuovo driver è molto più intuitivo. – KeksArmee