mongodb запрос updateMany: обновление полей в списке встроенных документов для всех документов в коллекции

#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.*/
  
})
  

MongoPlayGorund