Quero atualizar um _id
campo de um documento. Eu sei que não é uma boa prática. Mas, por algum motivo técnico, preciso atualizá-lo. Se eu tentar atualizá-lo, recebo:
> db.clients.update({ _id: ObjectId("123")}, { $set: { _id: ObjectId("456")}})
Performing an update on the path '_id' would modify the immutable field '_id'
E a atualização não é feita. Como posso atualizá-lo?
duplicate key error
nainsert
fila e não estiver preocupado com o problema mencionado por @elly, a solução mais simples é ligarremove
primeiro para a linha e depois para ainsert
linha. Odoc
arquivo já deve estar impresso na tela para facilitar a recuperação, na pior das hipóteses, mesmo se a inserção falhar, para documentos simples.Para fazer isso para toda a sua coleção, você também pode usar um loop (baseado no exemplo de Niels):
Nesse caso, UserId era o novo ID que eu queria usar
fonte
list()
é a lógica, mas para grandes bases de dados que pode esgotar a memóriaNo caso, você deseja renomear _id na mesma coleção (por exemplo, se quiser prefixar alguns _ids):
if (doc._id.indexOf ("2019:")! = 0) {... necessário para evitar loop infinito, pois forEach seleciona os documentos inseridos, mesmo através do método .snapshot () usado.
fonte
find(...).snapshot is not a function
mas fora isso, ótima solução. Além disso, se você deseja substituir_id
com o seu ID de costume, você pode verificar sedoc._id.toString().length === 24
a evitar que o loop infinito (assumindo que seus IDs personalizados não são também 24 caracteres ),Aqui eu tenho uma solução que evita várias solicitações, para loops e remoção de documentos antigos.
Você pode criar facilmente uma nova ideia manualmente usando algo como:
_id:ObjectId()
Mas sabendo que o Mongo atribuirá automaticamente um _id se estiver ausente, você pode usar o agregado para criar um$project
contendo todos os campos do seu documento, mas omita o campo _id. Você pode salvá-lo com$out
Portanto, se o seu documento for:
Então sua consulta será:
fonte
_id
valor especificado, em vez de permitir que o MongoDB gere outro.Você também pode criar um novo documento a partir da bússola do MongoDB ou usando o comando e definir o
specific _id
valor que deseja.fonte