(MongoDB Java) $push dans array

j'utilise mongo 2.2.3 et le pilote java. Mon dilemme, je dois $ pousser un champ et la valeur dans un tableau, mais je ne semble pas trouver comment faire cela. Un échantillon de mes données:

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

je peux $pousser dans le shell:

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

mais c'est quand je traduis ceci en java que je me confonds et je jette mon clavier contre un mur.

mon code java (incomplet et faux):

DBObject find = new BasicDBObject("_id", 1);
DBObject push = new BasicDBObject("$push", new BasicDBObject(
                        "scores", new BasicDBObject()));
31
demandé sur Cœur 2013-03-15 19:44:33

5 réponses

DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99));
DBObject updateQuery = new BasicDBObject("$push", listItem);
myCol.update(findQuery, updateQuery);
32
répondu Lucas Zamboulis 2014-06-19 09:28:59

Depuis mongodb-driver 3.1. il y a un constructeur de la classe com.mongodb.client.model.Updates avec des méthodes appropriées pour chaque cas de mise à jour. Dans ce cas, ce serait:

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

collection.updateOne(eq("_id", "1"),Updates.addToSet("scores", score));
13
répondu trinity 2016-10-29 11:28:19

si vous êtes plus à l'aise avec le format de requête de l'interpréteur de commandes, vous pouvez trouver qu'il est plus facile d'utiliser JSON.parse pour contstruct votre DBObject pour les $push:

import com.mongodb.util.JSON;

String json = "{$push:{scores:{type:'quiz', score:99}}}";
DBObject push = (DBObject) JSON.parse(json);
12
répondu JohnnyHK 2013-03-15 15:53:53

en utilisant Jongo, vous pouvez faire comme dans la coquille:

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

devient en Java:

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

Pas de fantaisie, DBObject nécessaire ;-)

6
répondu yves amsellem 2013-03-16 21:37:01

MongoDB Java driver peut simplifier cela. Utiliser $chacun au lieu de $pousser.

$chaque mongodb document de référence

Java échantillon -

    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<BasicDBObject> list = new ArrayList<>();
    list.add(addressSpec); list.add(addressSpec2);

    UpdateResult updateOne = individualCollection.updateOne(Filters.eq("_id", "5b7c6b612612242a6d34ebb6"), 
            Updates.pushEach("subCategories", list));
0
répondu vashishth 2018-08-22 18:55:11