【问题标题】:MongoDB's getLastError incorrectly shows no docs were updatedMongoDB 的 getLastError 错误地显示没有更新文档
【发布时间】:2012-11-08 07:50:21
【问题描述】:

为什么getLastError 显示没有更新文档?

> db.contacts.find()
{ "_id" : ObjectId("509b60e7c546b6dc73f57877"), "name" : "mike" }
> db.contacts.update({}, {name: 'peter'})
> db.runCommand({getLastError: 1})
{ "n" : 0, "connectionId" : 3188, "err" : null, "ok" : 1 }
> db.contacts.find()
{ "_id" : ObjectId("509b60e7c546b6dc73f57877"), "name" : "peter" }

getLastError 正在返回 n: 0,即使文档已明确更新。它也缺少updatedExisting 字段。我在一个示例 MongoHQ 数据库上远程运行它。

针对我的本地 MongoDB 实例运行,getLastError 正确返回:

> db.runCommand({getLastError: 1})
{
    "updatedExisting" : true,
    "n" : 1,
    "connectionId" : 1,
    "err" : null,
    "ok" : 1
}

【问题讨论】:

  • 当我使用 2.0 版本的 Mongo shell 和 2.2 数据库时,这似乎发生在我身上。可以试试用 2.2 或 2.2.1 版本的 shell 运行吗?

标签: mongodb mongohq


【解决方案1】:

这可能是连接重用的问题,也可能是外壳行为。 getLastError (GLE) 调用仅返回在执行 GLE 调用的连接上发生的最后一个操作的状态。

但是,当你使用 shell 时,它会在每次写操作后自动调用 GLE,所以你通常会得到一个空结果,因为 GLE 已经被调用了。尝试调用 getPrevError() 来代替 - 看看它是否会返回您所期望的结果。

MongoDB 驱动程序通过确保在将连接返回到池之前调用 GLE 并作为操作的结果(或错误)返回来避免此类问题,从而解决此问题。

【讨论】:

  • 谢谢。使用 MongoHQ 时,我没有意识到我的客户端和 MongoDB 实例之间存在一层。如果我知道的话,我不会猜到我可以在同一个 shell 会话中从池中获得不同的连接。我将把这个问题留一两天,看看我是否可以验证这一点或得到更明确的答案。
  • Mongo 和您的应用之间实际上并没有使用 MongoHQ 的层,所以这可能是不正确的。
  • 那是我的误解 - 您能想到的任何方式让 GLE 连接到不同的连接或返回执行不同的操作?
  • 与一些人聊天 - 建议替代解释 - 谢谢@MrKurt :)
  • 有趣。您的替代解释似乎是正确的。调用getPrevError 确实返回了我需要的东西。更有趣的是,对于本地实例的行为是不同的,其中对 getLastError 的调用返回了我期望的结果。 getPrevError 对 MongoHQ 实例和本地实例工作正常,但是,返回属性 nPrev 总是针对本地实例返回 1,但每次我针对 MongoHQ 实例调用它时都会递增。希望我知道为什么。谢谢大家的帮助。
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2014-10-15
  • 2011-08-04
相关资源
最近更新 更多