$ push и $ установлены в одном обновлении MongoDB - PullRequest
28 голосов
/ 31 января 2012

Я пытаюсь использовать Java-драйвер MongoDB для двух обновлений ($ 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: «поля, хранящиеся в БД, не могут начинаться с« $ »(плохой ключ:« $ push »)».

Если я сделаю два отдельных обновления, оба pushUpdate и setUpdate приведут к действительным результатам.

Спасибо!

Ответы [ 2 ]

50 голосов
/ 31 января 2012

Я не знаю драйвера 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}}]);
0 голосов
/ 02 июля 2019

Моя версия 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}});
...