Javascript 猫鼬,能';t更新数组元素:";关键字…$。。。不得包含''&引用;
我正在使用mongoose构建一个节点应用程序。 在我的mongoose模式中,我使用一个图像数组,这些图像是具有属性的对象。比如: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 }, }], })
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中更新数组项?