У меня есть документ пользователя с массивом Notes (объектов) внутри него. Я пытаюсь установить новое поле (_id) для всех элементов массива. Но это ничего не трогало. Это мой текущий код, я что-то пропустил?
db.users.update(
{'notes.added': '2018-10-22 04:42:45.336Z'},
{'$set': {'notes.$._id': new ObjectId()}},
{multi: true}
);
Кроме того, я нацелен на все заметки, где добавлено равно этой дате, можно ли нацелить ВСЕ записи без указания параметра?
Вам нужно включить только массив в параметр запроса. Использование свойства 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 в запросе. просто вложите его в "".
Если вы захотите обновить все массивы заметок документов, которые имеют минимум один объект-элемент, тогда вам также потребуется код
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}
);
_id
- это поле, которое использует mongoDB, и оно автоматически добавляется для каждого элемента в массиве, поэтому нет необходимости выполнять выборку вручную.