$ 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 выдают достоверные результаты.
Спасибо!
Ответы
Ответ 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}});