我正在尝试更新具有以下查询的嵌套属性的文档
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