Mongodb:无法保存添加到BasicDBList中的新元素

时间:2013-04-03 21:50:26

标签: java mongodb mongodb-java

我正在尝试将一个元素添加到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”:[]}

3 个答案:

答案 0 :(得分:1)

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

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

您必须使用更新,here是如何

答案 1 :(得分: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/

答案 2 :(得分:1)

感谢大家的回答。我发现了真正的问题。事实证明我的集合有上限,我不允许在封顶集合中的现有文档中插入更多数据。我将WriteConcern更改为FSYNC_SAFE后看到异常。我将所有的集合更改为uncapped,代码现在可以正常工作。