Подтвердить что ты не робот

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.

Я не уверен, как еще я могу запросить вложенные атрибуты, если не через точечную нотацию

4b9b3361

Ответ 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 - строка.