使用MongoDB Java Driver更新嵌入式文档中的字段?

时间:2013-03-29 18:11:42

标签: java mongodb

我正在尝试使用Java驱动程序对MongoDB中的嵌入式文档执行更新,但是会收到IllegalArgumentException,指出“存储在db中的字段不能包含。”

我的文档具有以下结构:

{
    "_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上看到了其他包含此点符号的答案。有什么我想念的吗?更新嵌入文档中字段的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

在上一个示例中,$set部分丢失了,这可能会导致问题。试试

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

代替。