Mongoose按键更新子文档 [英] Mongoose update subdocument by key

查看:46
本文介绍了Mongoose按键更新子文档的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

用于以下集合:

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

请告知。

推荐答案

只要文档中已存在该属性,您就可以执行以下操作:

   Collection.findOneAndUpdate({id: 1}, {
        $set: {
          "name.$[elem]": name
        }
      },
      {
        arrayFilters: [  { "elem.language":  name.language  } ],
        upsert: true,
        new: true
      })

这篇关于Mongoose按键更新子文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆