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. Сообщение об ошибке несколько вводило в заблуждение.