MongoDB Позиционный оператор all: вставлять определенные поля массива при обновлении

Я новичок в Mongo, и у меня есть некоторые данные, содержащие простой массив объектов:

{
  _id : MONGO_ID
  name: name1
  episodes: [
    {
      title: title1,
      someOtherField: someOtherValue1
    },
    {
      title: title2,
      someOtherField: someOtherValue2
    }
  ]
}

Я пытаюсь вставить все объекты как есть, если они не существуют. И если они это сделают, я хотел бы обновить только определенные поля.

Прочитав документы и этот ответ, я попытался сделать следующее:

recordArr.forEach((record, index) => {
   videos.updateMany(
    { "_id": record._id,          
      "episodes": {$exists: true}
    },
    { $setOnInsert: {
        episodes : record.episodes
      },
      $set: {
        name: record.name,                                                
        "episodes.$[].title" : record.episodes.title
      }
    },
    { upsert: true },
    (err, docs) => {
      if (err) reject(err);
      if (index === (recordArr.length -1)) {
        resolve(docs);
      }
    }
   );
});

И получил ошибку: cannot use the part (episodes of episodes.$[].title) to traverse the element

Я знаю, что Mongo не может назначить имя поля со знаком доллара в документе при вставке, поэтому я изначально устанавливаю данные в setOInInsert. Я также прочитал, что поле должно быть указано в части запроса. Поскольку поле может принимать несколько значений, я просто проверяю, существует ли поле в каждом объекте массива.

Мне удалось заставить его работать на первом элементе, используя позиционный оператор:

videos.updateMany(
        { "_id": record._id,          
          "episodes": {$exists: true}
        },
        { $setOnInsert: {
            episodes : record.episodes
          },
          $set: {
            name: record.name,                                                
            "episodes.$.title" : record.episodes[0].title
          }
        },
{ upsert: true }, true)

Мой вопрос касается использования позиционного оператора all, а не отфильтрованного позиционного оператора, на который ссылается ответ SO.

Это можно обойти?

Изменить: я использую Mlab. Оказывается, версия mlab для песочницы < 3.6, которая не поддерживает позиционный оператор all. Сообщение об ошибке несколько вводило в заблуждение.

0 ответов

Другие вопросы по тегам