MongoDB的getLastError错误地显示没有更新文档

时间:2012-11-08 07:50:22

标签: mongodb mongohq

为什么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
}

1 个答案:

答案 0 :(得分:2)

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

但是,当您使用shell时,它会在每次写操作后自动调用GLE,因此您通常会得到一个null结果,因为已经调用了GLE。请尝试拨打getPrevError() - 看看是否会返回您的预期。

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