36

我正在使用 mongo 2.2.3 和 java 驱动程序。我的困境,我必须将一个字段和值推入一个数组,但我似乎无法弄清楚如何做到这一点。我的数据样本:

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

我可以在 shell 中 $push:

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

5 回答 5

34
DBObject listItem = new BasicDBObject("scores", new BasicDBObject("type","quiz").append("score",99));
DBObject updateQuery = new BasicDBObject("$push", listItem);
myCol.update(findQuery, updateQuery);
于 2013-03-15T15:47:23.337 回答
21

因为每个更新案例都有一个带有适当方法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));
于 2016-10-29T11:28:19.910 回答
12

如果您对 shell 的查询格式更满意,您可能会发现使用它JSON.parse来构造您的DBObjectfor更容易$push

import com.mongodb.util.JSON;

String json = "{$push:{scores:{type:'quiz', score:99}}}";
DBObject push = (DBObject) JSON.parse(json);
于 2013-03-15T15:53:53.480 回答
6

使用 Jongo,您可以像在 shell 中一样

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

变成Java:

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

不需要花哨的 DBObject ;-)

于 2013-03-16T21:37:01.970 回答
1

MongoDB Java 驱动程序可以简化这一点。使用 $each 而不是 $push。

$each mongodb 参考文档

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

    UpdateResult updateOne = individualCollection.updateOne(Filters.eq("_id", "5b7c6b612612242a6d34ebb6"), 
            Updates.pushEach("subCategories", list));
于 2018-08-22T18:55:11.880 回答