【问题标题】:Mongoose update subdocument by keyMongoose 按键更新子文档
【发布时间】: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

请指教。

【问题讨论】:

    标签: javascript node.js mongodb mongoose mongoose-schema


    【解决方案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 , 新: 真, });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 2015-07-12
    • 2014-11-27
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多