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

その場合、保存呼び出しは機能するはずですが、$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

問題は、coll.save(dbObject) が何も更新していないことです。

これは挿入として機能し、コレクションに _id が既に存在するため、 duplicateKey 例外が発生します (構成のために表示されないだけです)。

アップデートを使用する必要があります。その方法は次 のとおりです

于 2013-04-03T23:32:41.490 に答える