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:虚线字段..对存储无效的主要内容,如果未能解决你的问题,请参考以下文章
是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”
是啥导致“'collaborators..$conditionalHandlers' 中的美元 ($) 前缀字段 '$conditionalHandlers' 对存储无效。”
MongoError 异常:FieldPath 字段名称可能不以“$”开头