(MongoDB Java) $ push into array

Estou usando o mongo 2.2.3 e o driver java. Meu dilema, eu tenho que empurrar um campo e valor para uma matriz, mas eu não consigo descobrir como fazer isso. Uma amostra dos meus dados:

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

Eu posso empurrar o shell:

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

mas é quando eu traduzo isso para java eu ​​confundo meu self e jogo meu teclado em uma parede.

meu código java (incompleto e errado) até agora:

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

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

Desde mongodb-driver 3.1. existe uma class de construtor com.mongodb.client.model.Updates com methods apropriados para cada caso de atualização. Nesse caso, isso seria:

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

Se você é mais compatível com o formato de consulta do shell, você pode achar que é mais fácil usar o JSON.parse para contstruct seu DBObject para o $push :

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

Usando o Jongo, você pode fazer como no shell :

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

Torna-se em Java:

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

Nenhum DBObject de fantasia precisava 😉

O driver Java do MongoDB pode simplificar isso. Use $ each em vez de $ push.

$ cada documento de referência mongodb

Amostra 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));