$push和$set在同一MongoDB更新中

2022-09-01 05:15:35

我正在尝试使用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合并到同一更新中时,我得到一个非法的ArgumentException:“存储在数据库中的字段不能以'$'开头(坏键:'$push')”。

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

谢谢!


答案 1

我不知道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}}]);

答案 2

我的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}});