Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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
Javascript 猫鼬,能';t更新数组元素:";关键字…$。。。不得包含''&引用;_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 猫鼬,能';t更新数组元素:";关键字…$。。。不得包含''&引用;

Javascript 猫鼬,能';t更新数组元素:";关键字…$。。。不得包含''&引用;,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在使用mongoose构建一个节点应用程序。 在我的mongoose模式中,我使用一个图像数组,这些图像是具有属性的对象。比如: const schemaPeople = new Schema({ name: { type: String, required: true, }, images: [{ url: { type: String }, etag: { type: String }, }], })

我正在使用mongoose构建一个节点应用程序。 在我的mongoose模式中,我使用一个图像数组,这些图像是具有属性的对象。比如:

const schemaPeople = new Schema({
  name: {
    type: String,
    required: true,
  },
  images: [{
    url: {
      type: String
    },
    etag: {
      type: String
    },
  }],
});

const Person = mongoose.model('people', schemaPeople);
personName = 'Alice';
imageDownloaded = {
  url: 'https://www.example.com/image1.jpg',
  etag: '123457890',
};
Person.updateOne(
  { name: personName, "images": { "$elemMatch": { "url": imageDownloaded.url } } },
  { $set: { "images.$.etag": imageDownloaded.etag } },
  function(err, result) {}
);
我的收藏中有很多人,每个人都有一个名字和一组图片,每个人都有自己的url属性。 当我下载一个人的图像时,我想在数据库中用附加属性来更新它,例如“etag”。所以我做了一些类似的事情:

const schemaPeople = new Schema({
  name: {
    type: String,
    required: true,
  },
  images: [{
    url: {
      type: String
    },
    etag: {
      type: String
    },
  }],
});

const Person = mongoose.model('people', schemaPeople);
personName = 'Alice';
imageDownloaded = {
  url: 'https://www.example.com/image1.jpg',
  etag: '123457890',
};
Person.updateOne(
  { name: personName, "images": { "$elemMatch": { "url": imageDownloaded.url } } },
  { $set: { "images.$.etag": imageDownloaded.etag } },
  function(err, result) {}
);
但我一直在犯这样的错误:

Error: key images.$.etag must not contain '.'
   at serializeInto (./node_modules/bson/lib/bson/parser/serializer.js:917:19)
   ...
我在网上找不到任何关于这个问题的有用参考资料,所以我想我遗漏了一些明显的东西。。。有人能帮忙吗

任何关于修改模式设计的建议也将受到欢迎。。。我是noSQL数据库设计的新手

我使用mongoose 5.9.27和mongodb 3.5.10模块

更新: 我刚刚找到了问题的根源。。。我为我的收藏使用了一个插件(保存收藏更改的历史记录):它是
mongoosehistory
(v0.8.0)

删除插件一切正常

可能是因为该插件的
更新
处理仍在进行中。。。我只是向这个项目提交了一份文件


谢谢任何人的帮助。。。请原谅,仅凭我提供的有关该问题的信息无法找到解决方案。

您应该这样做:

Person.updateOne(
        { name: personName },
        { $set: { "images.$[imageurl].etag": imageDownloaded.etag } }, {
        "arrayFilters": [
            { "imageurl.url": imageDownloaded.url }
        ]
    },
        function (err, result) { 
        //manage error and result
    }
);

这是你应该做的:

Person.updateOne(
        { name: personName },
        { $set: { "images.$[imageurl].etag": imageDownloaded.etag } }, {
        "arrayFilters": [
            { "imageurl.url": imageDownloaded.url }
        ]
    },
        function (err, result) { 
        //manage error and result
    }
);


我认为问题是版本不确定,看看它可能来自3.6,第二个选项是,但它也来自mongodb v3.6。这很简单,但我不理解你的问题。是否要在该数组中添加一个新对象?或者只是更新现有图像的etag?@turivishal:如果我正确理解你的评论,我认为这不是模块版本的问题:我只是升级到了最新的mongoose(5.11.9)和mongodb(3.6.3),同样的错误。。。还是说我应该降级?我更喜欢当前mongoose/mongodb版本的解决方案…@kevin buguecio:我想更新一个现有项目。。。在这个例子中,“url”属性已经存在,我想更新“etag”值…我想你误解了,对不起,我的句子,更新查询是来自mongodb v3.6的supports$,我不知道mongodb模块到底是什么?你是说npm?你能确认mongodb版本不是npm吗。看看这个在最新版本中的工作。我认为问题是版本不确定,看看它可能来自3.6,第二个选项是,但它也来自mongodb v3.6。这很简单,但我不理解关于你的问题的一点。是否要在该数组中添加一个新对象?或者只是更新现有图像的etag?@turivishal:如果我正确理解你的评论,我认为这不是模块版本的问题:我只是升级到了最新的mongoose(5.11.9)和mongodb(3.6.3),同样的错误。。。还是说我应该降级?我更喜欢当前mongoose/mongodb版本的解决方案…@kevin buguecio:我想更新一个现有项目。。。在这个例子中,“url”属性已经存在,我想更新“etag”值…我想你误解了,对不起,我的句子,更新查询是来自mongodb v3.6的supports$,我不知道mongodb模块到底是什么?你是说npm?你能确认mongodb版本不是npm吗。在最新版本中查看此操作。在尝试此解决方案时,我始终会得到“错误:关键图像。$[imageurl]。etag不能包含“.”-(然后看看turivishal和我读到的其他信息,似乎您有一个过时版本的MongoDB或MongoShellaryFilters,这也是我在第一篇评论中提到的MongoDB v3.6的支持。@Kevin Bugecio:MongoDB shell和MongoDB version()都是3.6.8…无法更新3.6中的数组项?也尝试此解决方案时,我始终会得到“错误:键图像。$[imageurl].etag不能包含“.”-(然后看看turivishal和我读到的其他信息,似乎您有一个过时版本的MongoDB或MongoShellaryFilters,这也是我在第一篇评论中提到的MongoDB v3.6的支持。@Kevin Bugecio:MongoDB shell和MongoDB version()都是3.6.8…不可能在3.6中更新数组项?