我正在尝试将一个元素添加到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”:[]}
答案 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,代码现在可以正常工作。