【问题标题】:How do I merge update a document using mongoose?如何使用猫鼬合并更新文档?
【发布时间】:2021-10-16 17:17:40
【问题描述】:

我在 moongose 中有一个模型架构:

const usersSchema = new Schema({
  users: [
    {
      username: { type: String, required: true },
      actions: [
        {
          action: { type: String },
          description: { type: String, required: true }
        }
      ]
    }
  ]
});

我的 mongodb 中还有一个文档:

{ user: 'John', action: [{ action: 'Like', description: 'Like post' },{ action: 'Share', description: 'Share post' }] }

现在通过 PATCH 请求,我得到一个更新的对象,我想与旧文档合并

{
  users: [
    {
      user: 'John',
      action: [{ action: 'Delete', description: 'Delete Post' }]
    },
    {
      user: 'Robert',
      action: [{ action: 'Share', description: 'Share post' }]
    }
  ]
};

我可以从数据库中提取旧文档并使用扩展运算符或Object.assign() 合并对象,但这是有问题的,因为随着时间的推移文档会增加并且拉取操作会花费更长的时间。

这是我尝试得到的最终结果。

{
  users: [
    {
      user: 'John',
      action: [
        { action: 'Like', description: 'Like post' },
        { action: 'Share', description: 'Share post' },
        { action: 'Delete', description: 'Delete Post' }
      ]
    },
    {
      user: 'Robert',
      action: [{ action: 'Share', description: 'Share post' }]
    }
  ]
}

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以使用聚合管道来处理您的请求正文并将users 集合转换为您的预期结果。最后通过$merge 更新您的收藏。

    步骤如下:

    1. $addFields 将补丁请求添加为字段 patchRequest 以便于处理
    2. $project 有条件的字段。 $concatArrays 如果userpatchRequest.users.user 相同,否则只需将patchRequest.users.action 用作action
    3. 最后在user 上合并,我相信这是您案件的关键。如果匹配则替换文档,如果不匹配则插入。

    这是Mongo playground 供您参考。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 2016-05-24
      • 2018-09-08
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      相关资源
      最近更新 更多