(MongoDB Java) $ push en matriz

Estoy usando mongo 2.2.3 y el controlador de Java. Mi dilema, tengo que $ presionar un campo y valorizarlo en una matriz, pero no puedo entender cómo hacerlo. Una muestra de mis datos:

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

Puedo presionar $ en el caparazón:

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

pero es cuando traduzco esto a java, me confundo y atojo mi teclado contra la pared.

mi código de Java (incompleto e incorrecto) hasta el momento:

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

Desde mongodb-driver 3.1. hay una clase de constructor com.mongodb.client.model.Updates con los métodos apropiados para cada caso de actualización. En este caso, esto sería:

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

Si es más cómodo con el formato de consulta del shell, puede encontrar que es más fácil usar JSON.parse para contornear su DBObject para $push :

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

Usando Jongo, puedes hacer lo mismo que en el shell :

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

Se convierte en Java:

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

No se necesita DBObject de lujo 😉

El controlador de MongoDB Java puede simplificar esto. Use $ cada uno en lugar de $ push.

$ cada documento de referencia mongodb

Muestra de 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));