MongoError:虚线字段..对存储无效

Posted

技术标签:

【中文标题】MongoError:虚线字段..对存储无效【英文标题】:MongoError: The dotted field .. is not valid for storage 【发布时间】:2015-07-12 21:37:27 【问题描述】:

我正在尝试使用以下查询更新具有匹配嵌套属性的文档

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.

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

【问题讨论】:

您的commentThread 是否包含整个文档,包括_id? $set 用特定值替换字段的值,如果要替换整个文档检查 Replace a document section in docs.mongodb.org/manual/tutorial/modify-documents 您找到解决方法了吗?有同样的问题。看来 Meteor 1.2 会有一个fix。 或者替换成. 【参考方案1】:

这是mongo 3.6之前对字段名的限制,现在可以将mongo server升级到3.6或更高版本来解决这个问题。

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

【讨论】:

【参考方案2】:

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

问题已解决。

【讨论】:

【参考方案3】:

您需要扁平化您的 $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'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 是一个字符串。

【讨论】:

【参考方案4】:

如果您想查询嵌套属性,您的架构应该是这样的:

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

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

【讨论】:

【参考方案5】:

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

centos机器可以按照以下流程升级mongodb版本:-

首先,您需要创建一个存储库 /etc/yum.repos.d/mongodb-org-4.2.repo 文件,以便 yum 知道在哪里可以找到最新的 MongoDB 包。

请将 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

现在您可以通过运行命令来验证版本:-

mongo

【讨论】:

以上是关于MongoError:虚线字段..对存储无效的主要内容,如果未能解决你的问题,请参考以下文章

在MongoDB中保存虚线字段[重复]

是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”

是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”

MongoError 异常:FieldPath 字段名称可能不以“$”开头

MongoError:无法推断要设置的查询字段,路径“用户”匹配两次

MongoError:无效操作,没有批量操作