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.

我不确定我还能查询嵌套属性,如果不是通过点表示法

这是Mongo 3.6之前的字段名称的限制,现在您可以将Mongo服务器更新为版本3.6或更高版本以解决此问题。

https://docs.mongodb.com/manual/reference/limits/#naming-restrictions

发生错误是因为键盘中存在点时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"

问题已解决。

您需要将 $set 运算符缩放param:

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's ok, as it's 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 是字符串。

这就是您要查询嵌套属性的模式的方式:

Schema({
  youtube: {
    etag:String,
    commentThreadId : {
      type: String,
      index: 1
    }
  },
...

然后,您可以使用'youtube.commentThreadId':'something'查询嵌套属性。

我也面临着类似的问题,并将mongo版本从3.2升级到4.2,现在似乎正常工作。

您可以按照以下程序进行CentOS机器来升级MongoDB版本: -

首先,您需要创建一个存储库/etc/yum.repos.d/mongodb-org-4.2.repo file,以便Yum知道在哪里可以找到最新的MongoDB软件包。p>请用适用于您的发行版和版本的代码名称替换Redhat/7,如下所示:

将以下内容放入您创建的回购文件中: -

[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

现在,您可以简单地发布以下命令来安装MongoDB的最新版本:$ sudo yum install -y mongodb -org

现在您可以通过running命令验证版本: -

mongo

最新更新