【问题标题】:MongoError: unknown command findAndModifyMongoError:未知命令 findAndModify
【发布时间】:2019-09-04 14:43:34
【问题描述】:

这可能是一个小众问题,因为 Stitch 相当新,但我还是会尝试!

我有一个 Stitch 应用,在底层 Atlas 集群上启用了 MongoDB 连接字符串选项。

当试图在我的代码中运行这一行时

const r = await collection.findOneAndDelete(filter);

我收到以下错误:

MongoError: unknown command findAndModify
    at Connection.<anonymous> (node_modules/mongodb-core/lib/connection/pool.js:443:61)
    at processMessage (node_modules/mongodb-core/lib/connection/connection.js:364:10)
    at TLSSocket.<anonymous> (node_modules/mongodb-core/lib/connection/connection.js:533:15)

但是,如果我直接连接到底层的 Atlas 集群,同样的代码也可以正常工作。

我正在为 NodeJS 版本 3.2.7 使用 MongoDB 驱动程序

有没有人遇到过这种情况,或者可以提供一些启示?

【问题讨论】:

  • 如果我没记错的话,findAndModify 是一个旧命令,已被updateMany 取代。我相信findOneAndDeleteremoveOne 取代。
  • 使用 deleteOne 有效,但它不会返回已删除的 id,因此不太一样。似乎 MongoDB 有线协议的 Stitch 实现出现了问题,因为 findOne 还返回一条错误消息:错误将 OP_MSG 处理为 CRUD 请求:无效的查找命令:不支持查找命令中的“batchSize”字段。我不是第一个通过 batchSize :)

标签: mongodb mongodb-atlas mongodb-stitch


【解决方案1】:

Stitch 应用,启用 MongoDB 连接字符串选项

目前来自Stitch Connection String (Wire ProtocolfindAndModify 操作未公开。

在这种情况下发生的是 MongoDB Node.JS 驱动程序 v3.2 rewrites findOneAndXXX 操作并使用 findAndModify 命令,但是 Stitch 后端(目前)尚未公开/支持该命令。

In March 2019, MongoDB Stitch SDKs support db.collection.findAndXXX() function。您可以使用三种官方的 Stitch Javascript/TypeScript SDK:

例如,您可以利用mongodb-stitch-server-sdk(通过Node.JS)调用findOneAndDelete()

或者,正如您所发现的,您可以直接连接到 Atlas 集群并使用 MongoDB Node.JS 驱动程序findOneAndDelete

【讨论】:

  • 这个答案忽略了我的问题中描述的主要细节。我提到我正在使用 findOneAndDelete 方法。只有提到 findAndModify 的错误。此外,我使用本机 NodeJS MongoDB 驱动程序进行连接,而不是 Stitch SDK。顺便说一句,这最终作为 Atlas 开发团队的一个错误被公开,这将在未来的某个时间(或不解决)解决。
  • 嗨@Juvaly 很抱歉误读了您的问题,我已经相应地更新了答案。
猜你喜欢
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多