web-dev-qa-db-ja.com

同じMongoDB更新での$ Pushと$ set

MongoDBのJavaドライバーを使用して、同じ操作でレコードに対して2つの更新($ 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);

$ setと$ PushをBasicDBListを介して同じ更新に結合すると、IllegalArgumentExceptionが発生します。

2つの個別の更新を行った場合、pushUpdateとsetUpdateの両方で有効な結果が生成されます。

ありがとう!

30
HolySamosa

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}}]);
50

私の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}});
0
arpan