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 的更有效方式

更新子文档、NodeJS 和 Mongoose 的更有效方式

Mongoose 不会更新子文档

Mongoose如何更新子文档字段?

Mongoose 子文档不会更新