Я пытаюсь использовать 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: "поля, хранящиеся в базе данных, не могут начинаться с '$' (Bad Key: '$push')".
Если я делаю два отдельных обновления, то и pushUpdate и setUpdate выдают корректные результаты.
Спасибо!
Я не знаю драйвера 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}}]);
Моя версия 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}});