Mongoose 按键更新子文档
Posted
技术标签:
【中文标题】Mongoose 按键更新子文档【英文标题】:Mongoose update subdocument by key 【发布时间】:2021-12-23 07:01:28 【问题描述】:对于以下集合:
id: Number
name:[
new Schema(
language: type: String, enum: ['en-US', 'fr-CA'] ,
text: String,
, _id: false
);
],
isActive: Boolean
以及如下示例数据:
id:1,
"name": [
"language": "en-US", "text": "Book",
"language": "fr-CA", "text": "livre"
],
isActive:true
// and so many other fields
,
id:2,
"name": [
"language": "en-US", "text": "Pen"
],
isActive:true
// and so many other fields
我想通过 Id:1 更新文档并仅更改法语的文本,我尝试过:
const input= "id":"1", "isActive": false
const name= "name": ["language": "fr-CA", "text": "Nouvel article"]
await langs.findByIdAndUpdate(
_id: input.id ,
...input, $addToSet: name ,
new: true, upsert: true
);
但结果是:(添加了另一个法语项目)
id:1,
"name": [
"language": "en-US", "text": "Book",
"language": "fr-CA", "text": "livre",
"language": "fr-CA", "text": "Nouvel article"
],
isActive:false
,
这是基于英国人的评论:
https://mongoplayground.net/p/atlw5ZKoYiI
请指教。
【问题讨论】:
【参考方案1】:只要文档中已经存在该属性,您就可以执行以下操作:
Collection.findOneAndUpdate(id: 1,
$set:
"name.$[elem]": name
,
arrayFilters: [ "elem.language": name.language ],
upsert: true,
new: true
)
【讨论】:
谢谢@Brit,我已按照您的建议使用了以下代码,它正在更改它,但如果它不存在则不会添加 (upsert:true) const payItem = await langs.findOneAndUpdate( _id: input.id , $set: 'name.$[elem]': name, ...input , arrayFilters: [ 'elem.language': name.language ], upsert: true , 新: 真, ); mongoplayground.net/p/atlw5ZKoYiI以上是关于Mongoose 按键更新子文档的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose - 使用 findOneAndUpdate 更新子文档
更新子文档、NodeJS 和 Mongoose 的更有效方式