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

Hol*_*osa 28 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);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ser*_*sev 50

我不懂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);
Run Code Online (Sandbox Code Playgroud)

这应该产生相当于

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

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

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