【问题标题】:Mongodb updates within a transaction事务中的MongoDB更新
【发布时间】:2021-08-18 04:43:39
【问题描述】:

我正在尝试从事务中更新文档。我正在使用带有传入会话对象的“findbyidandupdate”,但出现此错误:

MongooseError: Callback must be a function, got [object Object]

Node.js 中的相关后端代码。会话对象是从数据模型对象创建的,在这种情况下,数据对象是“设备”:

const session = await Device.startSession();

const transactionOptions = {
        readPreference: 'primary',
        readConcern: { level: 'local' },
        writeConcern: { w: 'majority' }
    };

const transactionResults = await session.withTransaction( async () => {
               const deviceUpdateResults = await 
    Device.findByIdAndUpdate(
                {session},
                (deviceid),
                {$push: {"reviews": (reviewid)}},
                { new : true, safe: true})
}

看起来该方法不能接受会话对象。如何将会话对象传递给更新方法?

【问题讨论】:

  • 能否请您更新您的问题并提供更多详细信息,1) 发布您尝试过的查询 2) 会话对象是什么,显示其中的内容 3) 控制您的输入 4) 显示预期结果。跨度>

标签: node.js mongodb transactions updates document


【解决方案1】:

在 Mongoose 文档中,findByIdAndUpdate 的签名与您使用的签名不同。首先findByIdAndUpdate只是一个实用方法,最终调用findOneAndUpdate,文档中也指出,所以参数基本相同。

您遇到的问题是您传递了太多参数:由于您使用的是函数的async 版本,因此您最多应该传递3 个参数。相反,对于回调版本,您需要 4 个参数以及最后的回调。

你应该这样称呼findByIdAndUpdate

const deviceUpdateResults = await Device.findByIdAndUpdate(
    deviceid,
    { $push: { "reviews": reviewid } },
    { session: session, new: true}
);

几乎没有关于您的问题的观察:

  • 我一直使用 MongoDB 的 NodeJS 原生驱动程序,所以 Mongoose 对我来说非常陌生,但如果您使用 startSession 启动 ClientSession,我希望您还需要使用 endSession 关闭它。另一种选择(对于本机驱动程序)是使用withSession,它接受会话有效的回调。
  • 目前,readPreference: 'primary' 可以省略,因为事务只能发生在主节点中。默认的readConcernlocal,所以你也可以省略它。
  • safe 选项不是已弃用吗?它甚至不再列在文档中。

【讨论】:

    【解决方案2】:

    您为什么不尝试使您的代码更简单一些。 试试这个

    await Device.updateOne({_id:_id},{$push:{"reviews":reviewId});
    

    第一个参数过滤数据,第二个参数更新数据

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-13
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多