MongoError: пунктирное поле.. недействительно для хранения
Я пытаюсь обновить документ с соответствующим вложенным атрибутом со следующим запросом
upsertByCommentThreadId: function(commentThread) {
return CommentThreads.update({
'youtube.commentThreadId': commentThread.youtube.commentThreadId
},
{
$set: commentThread
},
{
upsert: true
}
);
}
Схема:
Schema({
youtube: {
type: Object
},
'youtube.etag': {
type: String
},
'youtube.commentThreadId': {
type: String,
index: 1
},
...
Но я получаю сообщение об ошибке
Exception while invoking method ... MongoError: The dotted field 'youtube.commentThreadId' in 'youtube.commentThreadId' is not valid for storage.
Я не уверен, как еще я могу запросить вложенные атрибуты, если не через точечную нотацию
Ответы
Ответ 1
Ошибка возникает из-за того, что MongoDB не может работать, если в ключе присутствуют точки. Аналогичная ошибка,
MongoError: The dotted field '2016.11.14' in 'myData.days.2016.11.14' is
not valid for storage.
возникает, когда код:
day = "2016.11.14"
myData.days[ day ] = 11
Когда данные изменены на
day = "2016_11_14"
Проблема исправлена.
Ответ 2
Вам нужно сгладить ваш оператор $set
:
schema.update( {
'youtube.commentThreadId': commentThread.youtube.commentThreadId
},
{
$set: {
// Here is my change
'youtube.commentThreadId': commentThread.youtube.commentThreadId
}
},
{ /* opts */});
Вы не показываете свой commentThread
(параметр ввода для этой функции upsertByCommentThreadId()
), но я подозреваю, что вы отправляете объект, судя по этой части запроса. Пример:
let commentThread = {
youtube: {
commentThreadId: 12345
}
};
Итак, ваша часть запроса одобрена, но $set
ожидает простой ключ: значение, где ключ должен быть строкой.
Итак, вы отправляете что-то вроде:
CommentThreads.update({
// Here it ok, as it translated to:
// { 'youtube.commentThreadId': 12345 }
'youtube.commentThreadId': commentThread.youtube.commentThreadId
},
{
// but this gets expanded to a deeply nested object, like:
// { $set: { youtube: {commentThreadId: 12345}}}
$set: commentThread
},
{/* opts */}
);
Итак, ваш оператор $set
хочет простой { key: value }
, где key
- строка.