Невозможно добавить поле _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
    },
}

С поддокументом с вопросами я сталкиваюсь с двумя проблемами:

  1. Иногда, но не всегда, есть устаревшее поле "id", которое я хочу сбросить, но мой запрос не работает.

  2. Я хочу добавить поле _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})
Другие вопросы по тегам