#mongodb #mongodb-query #spring-data-mongodb #mongodb-atlas
#mongodb #mongodb-запрос #spring-data-mongodb #mongodb-atlas
Вопрос:
У меня есть коллекция, которая называется Store, например:
@Document("Store")
public class Store implements Persistable<String> {
@Id
private String storeNum;
private String publicHealthUnit;
private List<RestrictionTracker> restrictionTracker;
}
Встроенный отслежыватель ограничений документов выглядит следующим образом:
public class RestrictionTracker {
private int dailyCapRunningTotal;
private int weeklyCapRunningTotal;
}
Я пытаюсь создать запланированный триггер, который устанавливает все значения поля dailyCapRunningTotal равными 0 в каждом встроенном документе RestrictionTracker для каждого отдельного документа в коллекции хранилища — каждые 24 часа, начиная с 12 вечера по восточному времени (я настрою выражение cron в GMT)
Я пытаюсь использовать следующий запрос:
collection.updateMany(
{},
{ $set: {"restrictionTracker.dailyCapRunningTotal":0}}
);
В коллекции хранилища есть документ, в котором есть список RestrictionTrackers с 2 документами в них — для полей dailyCapRunningTotal установлены значения 30 и 50
когда я запускаю вышеупомянутый запрос, я получаю следующую ошибку:
отклонение неперехваченного обещания: множественные ошибки записи: [{ошибки записи: [{Невозможно создать поле ‘dailyCapRunningTotal’ в элементе {restrictionTracker: [ { dailyCapRunningTotal: 30 }, { dailyCapRunningTotal: 50 } ]}}]}, {}]
Мне кажется, что он пытается создать новое поле со значением 0 вместо замены существующих значений
Не уверен, в чем проблема с синтаксисом, поскольку я использую запросы, приведенные в следующем онлайн-руководстве: https://www.mongodbtutorial.org/mongodb-crud/mongodb-updatemany /
Любая помощь будет оценена. Спасибо.
Комментарии:
1. Можете ли вы предоставить образец документа из вашей базы данных.
2. @AnshumanTripathy вы решили свою проблему?
3. @wak786 это json-представление одного документа в коллекции хранилища { «storeNum»: «71249», «publicHealthUnit»: «222», «restrictionTracker»: [ { «dailyCapRunningTotal»: 30, «weeklyCapRUnningTotal»: 15 }, { «dailyCapRunningTotal»: 20, » Еженедельный зачет Итого»: 10 } ] } Все, что я хочу сделать, это изменить значения полей dailyCapRunningTotal в каждом встроенном документе каждого документа хранилища
4. @charlycou еще нет
Ответ №1:
Вы можете просмотреть позиционный оператор $[] . вы можете попробовать использовать этот запрос
collection.updateMany({},{ $set: {"restrictionTracker.$[].dailyCapRunningTotal":0}});
Комментарии:
1. изменяет ли позиционный оператор только первый встроенный документ в списке встроенных документов? У меня есть документ в коллекции хранилища, который выглядит следующим образом: { «storeNum»: «71249», «publicHealthUnit»: «222», «restrictionTracker»: [ { «dailyCapRunningTotal»: 30, «weeklyCapRUnningTotal»: 15 }, { «dailyCapRunningTotal»: 20, » Еженедельный итоговый результат»:10 } ] } и я хочу изменить значение каждого поля dailyCapRunningTotal в каждом встроенном документе каждого документа хранилища
2. это изменит все встроенные документы. mongoplayground.net/p/mL4fQIc_2uJ
Ответ №2:
Я думаю, что ответ @ charlycou должен был сработать. Я не знаю, почему у вас это не сработало.
Добавление другой версии запроса с некоторыми комментариями. Также добавлена ссылка на mongo playground.
db.collection.update(
{},/**filter criteria that matches all documents in collection*/
{
$set: {
"restrictionTracker.$[].dailyCapRunningTotal": 0/** `$[]` means all the elements of array will get updated*/
}
},
{
multi: true/** will update all the documents matching the filter criteria and not only the first document.*/
})