Обновление всех элементов во встроенном массиве mongodb

1

У меня есть документ пользователя с массивом Notes (объектов) внутри него. Я пытаюсь установить новое поле (_id) для всех элементов массива. Но это ничего не трогало. Это мой текущий код, я что-то пропустил?

 db.users.update(
  {'notes.added': '2018-10-22 04:42:45.336Z'},
  {'$set': {'notes.$._id': new ObjectId()}},
  {multi: true}
);

Кроме того, я нацелен на все заметки, где добавлено равно этой дате, можно ли нацелить ВСЕ записи без указания параметра?

  • 0
    Можете ли вы показать образец ваших данных? _id - это поле, которое использует mongoDB, и оно автоматически добавляется для каждого элемента в массиве, поэтому нет необходимости выполнять выборку вручную.
Теги:

2 ответа

1
Лучший ответ

Вам нужно включить только массив в параметр запроса. Использование свойства like notes.added не будет работать. Оператору $ требуется массив в операторе запроса для итерации.

db.users.update({notes:{$exists: true}}, {$set:{"notes.$._id": new ObjectId()}}, {multi:true});

Надеюсь, поможет.

Edit1: если у вас есть несколько документов, и вы хотите редактировать все массивы во всех документах, вам нужно использовать updateMany так:

db.users.updateMany({notes:{$exists: true}}, {$set:{"notes.$[elem]._id": new ObjectId()}},{arrayFilters:[{"elem.a" : {$gte: 0}}]});

где arryFilters - это фильтр на элементах массива. Этот запрос будет обновлять все массивы, у которых есть свойство, большее или равное 0. При этом вы также можете использовать notes.property в запросе. просто вложите его в "".

0

Если вы захотите обновить все массивы заметок документов, которые имеют минимум один объект-элемент, тогда вам также потребуется код

db.users.update(
    {"notes": { $exists: true, $not: {$size: 0} }}, 
    {'$set': {'notes.$._id': new ObjectId()}}, 
   {multi: true}

);

С добавленным запросом даты просто добавьте свое состояние, подобное этому

db.users.update(
        {"notes": { $exists: true, $not: {$size: 0} }, 'notes.added': '2018-10-22 04:42:45.336Z'}, 
        {'$set': {'notes.$._id': new ObjectId()}}, 
       {multi: true}
);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню