Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb MongoError:虚线区域。。对存储无效_Mongodb_Meteor_Schema - Fatal编程技术网

Mongodb MongoError:虚线区域。。对存储无效

Mongodb MongoError:虚线区域。。对存储无效,mongodb,meteor,schema,Mongodb,Meteor,Schema,我试图用以下查询更新具有匹配嵌套属性的文档 upsertByCommentThreadId: function(commentThread) { return CommentThreads.update({ 'youtube.commentThreadId': commentThread.youtube.commentThreadId }, { $set: commentThread }, {

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

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.

我不知道如何查询嵌套属性,如果不是通过点表示法,您需要展平您的
$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
需要一个简单的key:value,其中key必须是字符串

因此,您发送的内容如下:

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
是一个字符串。

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

问题已经解决。

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


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

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

然后你可以使用youtube.commentThreadId:“something”来查询嵌套属性。

我也遇到了类似的问题,将mongo版本从3.2升级到了4.2,现在看起来工作正常

您可以按照centos machine的以下步骤升级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安装-y mongodb org

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

mongo

commentThread是否包含整个文档,包括_id?$set将某个字段的值替换为特定值,如果要替换整个文档,请选中中的“替换文档”部分。是否找到解决方法?有相同的问题。Meteor 1.2似乎也有一个值。或者替换为.;