【问题标题】:return updated models in mongoose using updateMany?使用 updateMany 在猫鼬中返回更新的模型?
【发布时间】:2019-05-02 10:13:41
【问题描述】:

这是我的代码:

const result = await Todo.updateMany(
      { _id: { $in: ids }, userId },
      { $set: { complete } },
      { new: true }
    ).populate('userId', '_id');
res.json({ todos: result })

它适用于更新数据,但它返回:

{ n: 1,
  nModified: 1,
   opTime:
    { ts:
       Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1543568180 },
      t: 1 },
   electionId: 7fffffff0000000000000001,
   ok: 1,
   operationTime:
    Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1543568180 },
   '$clusterTime':
    { clusterTime:
       Timestamp { _bsontype: 'Timestamp', low_: 1, high_: 1543568180 },
      signature: { hash: [Binary], keyId: [Long] } } }

如何退回更新后的模型?

【问题讨论】:

  • updateMany 操作没有new: true 选项,甚至不返回更新后的文档。如果您需要获取更新的文档,您需要使用update 或findOneandUpdate 命令在ids 上进行映射。

标签: mongodb mongoose


【解决方案1】:

我认为不可能更新多个文档并返回所有更新的文档。

update() 或updateMany() 方法更新多个文档并仅返回WriteResult


如果使用 findAndModify() 的 MongoDB 方法使用 {new: true} 更新单个文档,则您可以更新文档作为响应。

来自文档。

findAndModify : findAndModify 命令修改并返回单个 文档。默认情况下,返回的文档不包含 对更新所做的修改。用 对更新进行的修改,请使用新选项。

你可以做的是:

再次获取那些更新的文档。

const result = await Todo.updateMany(
      { _id: { $in: ids }, userId },
      { $set: { complete } },
      { new: true }
    ).populate('userId', '_id');

// here you can update and then get all documents again
const updatedResult = await Todo.find(
      { _id: { $in: ids }, userId }
    ).populate('userId', '_id');

res.json({ todos: updatedResult });

【讨论】:

  • 这就是我想说的,你不能使用updateMany返回所有更新的文档。
  • 你好,我是猫鼬的新手,你认为我应该使用什么方法来实现返回那些更新的模型?
【解决方案2】:

更新查询只返回记录数、更新记录数、操作时间、状态等更新信息。

如果你想返回记录那么你需要使用

findAndModify()

Mongodb findAndModify

另外,您可以使用 save(),如果存在,它将更新文档,否则会创建新文档。但是 save() 一次只允许一条记录。因此,您需要使用循环来更新多条记录。

Mongode save()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2021-12-04
    相关资源
    最近更新 更多