Я хочу обновить _id
поле одного документа. Я знаю, что это не очень хорошая практика. Но по какой-то технической причине мне нужно его обновить. Если я попытаюсь обновить его, я получу:
> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'
И обновление не производится. Как мне его обновить?
duplicate key error
вinsert
строке и не беспокоитесь о проблеме, упомянутой @skelly, самое простое решение -remove
сначала позвонить на линию, а затем позвонить на нееinsert
. Онdoc
уже должен быть напечатан на вашем экране, чтобы его можно было легко восстановить, в худшем случае, даже если вставка не удалась, для простых документов.Чтобы сделать это для всей вашей коллекции, вы также можете использовать цикл (на основе примера Нильса):
В этом случае UserId был новым идентификатором, который я хотел использовать.
источник
list()
логично, но для больших баз данных это может истощить памятьВ случае, если вы хотите переименовать _id в той же коллекции (например, если вы хотите добавить префикс к некоторым _ids):
if (doc._id.indexOf ("2019:")! = 0) {... необходимо для предотвращения бесконечного цикла, поскольку forEach выбирает вставленные документы, даже с помощью используемого метода .snapshot () .
источник
find(...).snapshot is not a function
но кроме этого, отличное решение. Кроме того, если вы хотите заменить_id
свой собственный идентификатор, вы можете проверить, следует лиdoc._id.toString().length === 24
предотвратить бесконечный цикл (при условии, что ваши собственные идентификаторы также не содержат 24 символа ),Здесь у меня есть решение, позволяющее избежать многократных запросов, циклов и удаления старых документов.
Вы можете легко создать новую идею вручную, используя что-то вроде:
_id:ObjectId()
Но зная, что Mongo автоматически назначит _id, если он отсутствует, вы можете использовать агрегат для создания,$project
содержащего все поля вашего документа, но опустите поле _id. Затем вы можете сохранить его с помощью$out
Итак, если ваш документ:
Тогда ваш запрос будет:
источник
_id
для параметра заданное значение, а не позволять MongoDB сгенерировать другое.Вы также можете создать новый документ из компаса MongoDB или с помощью команды и установить нужное
specific _id
значение.источник