0

我正在尝试将一个元素添加到 BasicDBList 数组并将其保存回 Mongodb,但是当我检查结果时,它没有被写入。我做错了什么?我使用 java 驱动程序版本 2.7.2。

DBObject dbObject = coll.findOne(dbQuery);

BasicDBList unreadMsgs = (BasicDBList) dbObject.get("unreadMsgs");

Logger.debug("before incrementing unreadMsgs" + dbObject.toString());

unreadMsgs.add(new BasicDBObject("id", 1).append("unreadMsg", 1));
Logger.debug("after incrementing unreadMsgs : " + dbObject.toString());
coll.save(dbObject);
Logger.debug("check result: " + coll.findOne(dbQuery).toString());

在增加 unreadMsgs{ "_id" : { "$oid" : "515c5eb88e3278e9c9d55867"} , "unreadMsgs" : [ ]} 之前

增加 unreadMsgs 后:{“_id”:{“$oid”:“515c5eb88e3278e9c9d55867”},“unreadMsgs”:[{“id”:1,“unreadMsg”:1}]}

检查结果:{“_id”:{“$oid”:“515c5eb88e3278e9c9d55867”},“unreadMsgs”:[]}

4

3 回答 3

1

save调用应该适用于这种情况,但我建议您使用带有$addToSet操作的更新。

这是代码:

DBObject addToSetObj = BasicDBObjectBuilder.start()
    .push("$addToSet")
        .push("unreadMsgs")
            .add("id", 1)
            .add("unreadMsg", 1)
        .pop()
    .pop()
.get();

// addToSetObj will be { "$addToSet" : { "unreadMsgs" : { "id" : 1 , "unreadMsg" : 1}}}


coll.update(dbQuery, addToSetObj);
Logger.debug("check result: " + coll.findOne(dbQuery).toString());

对如何使用 addToSet 有任何疑问,请查看:http ://docs.mongodb.org/manual/reference/operator/addToSet/

于 2013-04-04T18:17:26.390 回答
1

谢谢大家的回答。我发现了真正的问题。事实证明,我的集合是有上限的,并且不允许我将更多数据插入到有上限的集合中的现有文档中。将 WriteConcern 更改为 FSYNC_SAFE 后,我看到了异常。我将所有收藏都更改为无上限,并且代码现在可以使用。

于 2013-04-04T21:56:18.303 回答
1

问题是 coll.save(dbObject) 没有更新任何东西。

它作为插入工作,并且由于集合中已经存在 _id,因此您会收到 duplicateKey 异常(由于配置,您只是看不到它)。

你必须使用更新,这里是如何

于 2013-04-03T23:32:41.490 回答