Подтвердить что ты не робот

(MongoDB Java) $push в массив

Я использую mongo 2.2.3 и java-драйвер. Моя дилемма, я должен $нажимать поле и значение в массив, но я не могу понять, как это сделать. Образец моих данных:

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

Я могу $нажать в оболочке:

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

но когда я переводил это в java, я путаю себя и зажимал клавиатуру у стены.

мой код java (неполный и неправильный):

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

Ответ 1

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

Ответ 2

Если вы более совместимы с форматом запроса оболочки, вам может быть проще использовать JSON.parse, чтобы скомпоновать ваш DBObject для $push:

import com.mongodb.util.JSON;

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

Ответ 3

Так как mongodb-driver 3.1. существует класс строителя com.mongodb.client.model.Updates с соответствующими методами для каждого случая обновления. В этом случае это будет:

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

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

Ответ 4

Используя Jongo, вы можете сделать как в оболочке:

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

Становится на Java:

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

Необязательный DBObject необходим; -)