Невозможно добавить поле _id в поддон монго в Mlab
В моей базе данных Mlab Mongo 3.2 у меня есть коллекция, которая выглядит следующим образом:
{
"_id": {
"$oid": "5752d....87985"
},
"name": "...etation",
"description": null,
"user_id": ".....",
"questions": [
{
"prompt": "The conclusions drawn seemed clear to most researchers, however, others were unconvinced, arguing that everything is open to ____________.",
"answer": "interpretation",
"created_at": "2014-11-09T14:59:38.154",
"updated_at": "2014-11-09T14:59:38.154",
"filled_answer": null
},
{
"id": 922,
"prompt": "His existential quest for Truth is in fact the key to his understanding and ____________ of the Bhagavad-Gītā.",
"answer": "interpretation",
"created_at": "2014-10-03T08:07:40.295",
"updated_at": "2014-10-03T08:07:40.295",
"filled_answer": null
},
}
С поддокументом с вопросами я сталкиваюсь с двумя проблемами:
Иногда, но не всегда, есть устаревшее поле "id", которое я хочу сбросить, но мой запрос не работает.
Я хочу добавить поле _id ObjectID, где они еще не существуют. В настоящее время некоторые из них есть, а некоторые нет.
Я пробовал несколько запросов, но ни один, кажется, не работает. Например:
db.droplets.updateMany({"questions.$._id": { $exists: false }},{ $set: {"questions.$._id": new ObjectId()}},{"multi": true, "upsert": true})
Монго говорит мне: "Позиционный оператор не нашел нужного соответствия в запросе"
Обновить
Я успешно нашел способ удалить все вопросы, используя следующий скрипт:
db.droplets4.find().forEach(function (doc) {
doc.questions.forEach(function (question) {
if (question.id) {
delete question.id
}
});
db.droplets.save(doc);
});
Но та же стратегия не работает для добавления идентификаторов объектов. Этот код не работает:
db.droplets4.find().forEach(function (doc) {
doc.questions.forEach(function (question) {
if (!question._id) { question._id = new ObjectId() }
});
db.droplets.save(doc);
});
1 ответ
Это должно работать нормально для вас
db.droplets4.updateMany( {
"questions._id" : null
},{ $set: {"questions.$._id": new ObjectId()}},{"multi": true, "upsert": true})