4

Java ドライバーを使用して MongoDB の埋め込みドキュメントを更新しようとしていますが、「データベースに格納されているフィールドには . を含めることはできません」という IllegalArgumentException が返されます。

私の文書の構造は次のとおりです。

{
    "_id" : ObjectId("5155d102a47d7b00b7e4bed2"),
    "foo" : {
        "bar" : {
            "name" : "Now"
        }
    }
}

このような更新を実行したい

var query = {_id:ObjectId("5155d102a47d7b00b7e4bed2")};
var update = {"foo.bar.time":new Date()};
var withSet = {$set:update};
db.samples.update(query,withSet);

コンソールからドキュメントを正しく変更します

{
    "_id" : ObjectId("5155d102a47d7b00b7e4bed2"),
    "foo" : {
        "bar" : {
            "name" : "Now",
            "time" : ISODate("2013-03-29T18:02:51.591Z")
        }
    }
}

Javaで同じことをしようとしても成功していません。私はこれを試しました:

BasicDBObject query = new BasicDBObject("_id", new ObjectId("5155d102a47d7b00b7e4bed2"));

BasicDBObject time = new BasicDBObject("time", new Date());
BasicDBObject bar = new BasicDBObject("bar", time);
BasicDBObject foo = new BasicDBObject("foo", bar);
BasicDBObject withSet = new BasicDBObject("$set", foo);

samples.update(query, withSet);

しかし、埋め込まれたバー オブジェクトを破壊し、名前を破壊します。

私も試しました:

BasicDBObject foo = new BasicDBObject();
foo.append("foo.bar.time", new Date());    
samples.update(query, foo)

しかし、IllegalArgumentException を受け取ります。

このドット表記を含む Stack Overflow で選択された他の回答を見てきました。足りないものはありますか?埋め込まれたドキュメントのフィールドを更新する適切な方法は何ですか?

4

1 に答える 1

6

最後の例では、$setパーツが欠落しています。これが問題を引き起こしている可能性があります。試す

samples.update(
  query,
  new BasicDBObject(
    "$set",
    new BasicDBObject("foo.bar.time", new Date())
));

代わりは。

于 2013-03-29T21:05:37.493 に答える