могу догадаться, как обновить значение поля последнего элемента массива.
с первым элементом массива, как я понял, все просто: {$set: {"someArray.$.field": "value"}}
а как сделать такое с последним?
Мб что-то из этого поможет db.collection.updateMany( { фильтр }, { $set: { "массив.$[элемент]": "новое_значение" } }, { arrayFilters: [{ "элемент": { $eq: { $arrayElemAt: ["$массив", -1] } } }] } )
чет ничего не обновляется при таком запросе. правда я set модифицировал так, что он стал "массив.$[элемент].поле". но вроде сломаться от этого не должно
db.collection.updateMany( {}, { $set: { "someArray.$[last].field": "value" } }, { arrayFilters: [ { "last": { $eq: { $arrayElemAt: [ "$someArray", -1 ] } } } ] } )
ничего не обновляет. запрос выдает matchedCount 19, а modifiedCount в итоге 0
сли запрос выполняется без ошибок, но при этом modifiedCount равен 0, это может означать, что вам необходимо обновить документы, которые соответствуют фильтру, переданному в первом параметре функции updateMany. Проверьте, что ваш фильтр правильно выбирает документы, которые должны быть обновлены. Можно также попробовать выполнить запрос с использованием метода find вместо updateMany, чтобы проверить, соответствует ли ваш фильтр документам, которые вы хотите изменить. Также обратите внимание на наличие индексов на полях, которые вы используете для фильтрации. Отсутствие индекса может замедлить выполнение запроса и привести к тому, что изменения не будут внесены в документы. Если вы все еще столкнулись с проблемой, попробуйте добавить параметр { multi: true } в вызов updateMany, чтобы обновить все соответствующие документы: db.collection.updateMany( { /* ваш фильтр */ }, { $set: { "someArray.$[last].field": "value" } }, { arrayFilters: [ { "last": { $eq: { $arrayElemAt: [ "$someArray", -1 ] } } } ], multi: true } )
То что выше вам скинул оно от части не работает т.к. условие $arrayElemAt: [ "$someArray", -1 ], возвращает сам элемент, а не index. В качестве решения можно сделать следующее: 1. Прокинуть функцию 2. Использовать курсор 3. Выполнить запрос аггрегации и получить _id и размер массива $size. После чего выполнить запрос(-ы), где вы сами высчитаете длину массива.
Обсуждают сегодня