2017-01-07 10 views
2

Я хочу обновить свое поле _id в одном из документов (показано ниже).Обновление поля _id в MongoDB

{ 
_id : ObjectId("586d9d5d23352af1a4aa05f7"), 
name: "Soham", 
age : 99, 
city : "XYZ" 
} 

Так что я побежал следующие шаги:

var doc = db.names.find({name:"Soham"}); 
doc._id = 111 ; -- 111 is not present in that collection for any document 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
db.names.insert(doc); 

Первые 3 строки не бросил какую-то ошибку, но в тот момент я выполнил команду вставки, она бросала ошибку. Может кто-нибудь, пожалуйста, дайте мне знать, что происходит не так.

Заранее благодарен!

+1

Сначала вы должны прочитать документацию. Поле '_id 'является ** первичным ключом ** эквивалентом SQL в MongoDB, а его формат - [ObjectId] (https://docs.mongodb.com/manual/reference/method/ObjectId/). Он имеет четко определенную структуру. Таким образом, вы ** не можете установить произвольное значение в качестве идентификатора для документа. Во-вторых, вы должны ** никогда не делать этого. Какова ваша цель? –

+0

@guzgarcia '_id' в MongoDB не обязательно является' ObjectId', это может быть все, что вы хотите, включая сложный объект. – GaspardP

+0

@Soham: Пожалуйста, включите ошибку, вызванную – GaspardP

ответ

2

Выбрасывает ошибку, так как вы не можете обновить поле _id.

Чтобы установить новый идентификатор, сначала вы найдете документ (используя findOne, поскольку вы ищете только один документ), чем нужно создать новый документ с новым идентификатором и вставить его, чем мы можем безопасно удалить старый:

var doc = db.names.find_one({name:"Soham"}); 
doc._id = 111 ; 
db.names.insert(doc); 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
+0

Спасибо, что так много, да, это сработало. Я делал то же самое, но вместо findOne я использовал только что найти. Во всяком случае, findOne работал. Еще раз спасибо. – Soham

+0

Кажется, найти или найтиОн не проблема, мы должны сначала вставить, а затем удалить не наоборот. – Soham

+0

Нет, не проблема, но: find вернет курсор, который будет оцениваться в списке. findOne вернет только один документ. – sergiuz