我尝试使用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都会产生有效的结果。
谢谢!
答案 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}});