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

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

Спасибо!

28
задан Parvin Gasimzade 14 August 2012 в 13:10
поделиться

2 ответа

Я не знаю драйвера 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
ответ дан 28 November 2019 в 03:14
поделиться

Моя версия 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
ответ дан 28 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: