(MongoDB Java) $ spingere verso l’array

Sto usando mongo 2.2.3 e il driver java. Il mio dilemma, devo spingere un campo e 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 mi confondo e chino la tastiera al muro.

il mio codice java (incompleto e sbagliato) finora:

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

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

Dal momento che mongodb-driver 3.1. esiste una class di com.mongodb.client.model.Updates con metodi appropriati per ogni caso di aggiornamento. In questo caso questo sarebbe:

 Document score = new Document().append("type", "quiz") .append("score",99); collection.updateOne(eq("_id", "1"),Updates.addToSet("scores", score)); 

Se sei più consono con il formato di query della shell, potresti scoprire che è più semplice utilizzare JSON.parse per contegtruire il tuo DBObject per $push :

 import com.mongodb.util.JSON; String json = "{$push:{scores:{type:'quiz', score:99}}}"; DBObject push = (DBObject) JSON.parse(json); 

Usando Jongo, puoi fare come nella 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); 

Necessario DBObject di fantasia 😉

Il driver Java MongoDB può semplificare questo. Usa $ ciascuno invece di $ push.

$ ogni documento di riferimento mongodb

Campione Java –

  BasicDBObject addressSpec = new BasicDBObject(); addressSpec.put("id", new ObjectId().toString()); addressSpec.put("name", "one"); BasicDBObject addressSpec2 = new BasicDBObject(); addressSpec2.put("id", new ObjectId().toString()); addressSpec2.put("name", "two"); List list = new ArrayList<>(); list.add(addressSpec); list.add(addressSpec2); UpdateResult updateOne = individualCollection.updateOne(Filters.eq("_id", "5b7c6b612612242a6d34ebb6"), Updates.pushEach("subCategories", list));