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
      })

相关文章