同一个MongoDB更新中的$ push和$ set

时间:2012-01-30 21:41:48

标签: java mongodb mongo-java

我尝试使用MongoDB的Java驱动程序对同一操作中的记录进行两次更新($ set和$ push)。我使用的代码类似于以下内容:

    BasicDBObject pushUpdate = new BasicDBObject().append("$push", new BasicDBObject().append("values", dboVital));
    BasicDBObject setUpdate = new BasicDBObject().append("$set", new BasicDBObject().append("endTime", time));
    BasicDBList combinedUpdate = new BasicDBList();
    combinedUpdate.add( pushUpdate);        
    combinedUpdate.add( setUpdate);


    collection.update( new BasicDBObject().append("_id", pageId), combinedUpdate, true, false);

当我通过BasicDBList将$ set和$ push组合到同一个更新中时,我得到一个IllegalArgumentException:"存储在db中的字段不能以' $'开头。 (坏键:' $ push')"。

如果我进行两次单独的更新,pushUpdate和setUpdate都会产生有效的结果。

谢谢!

2 个答案:

答案 0 :(得分:49)

我不懂Java驱动程序,但你必须在那里创建一个列表吗?如果您尝试使用此代码会发生什么?

BasicDBObject update = new BasicDBObject().append("$push", new BasicDBObject().append("values", dboVital));
update = update.append("$set", new BasicDBObject().append("endTime", time));

collection.update( new BasicDBObject().append("_id", pageId), update, true, false);

这应该产生相当于

db.collection.update({_id: pageId}, {$push: {values: dboVital}, $set: {endTime: time}});

而你的代码产生(我怀疑)这个:

db.collection.update({_id: pageId}, [{$push: {values: dboVital}}, {$set: {endTime: time}}]);

答案 1 :(得分:0)

我的mongodb版本是3.4.20,并且在使用时

db.collection.update({_id: pageId}, [{$push: {values: dboVital}}, {$set: {endTime: time}}]);

我收到错误

[thread1] Error: field names cannot start with $ [$push] :

要解决该错误,我们可以使用:

db.collection.update({_id: pageId}, {$push: {values: dboVital}, $set: {endTime: time}});