Подтвердить что ты не робот

$ push и $установлены в одном обновлении MongoDB

Я пытаюсь использовать драйвер 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: "поля, хранящиеся в db, не могут начинаться с" $"(Bad Key:" $push ")".

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

Спасибо!

4b9b3361

Ответ 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}});