1

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" }

getLastErrorn: 0ドキュメントが明らかに更新されたにもかかわらず、が返されます。また、updatedExistingフィールドがありません。サンプルのMongoHQデータベースでこれをリモートで実行しています。

ローカルの MongoDB インスタンスに対して実行すると、次のようにgetLastError正しく返されます。

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

1 に答える 1

2

これは、接続の再利用に問題があるか、シェルの動作である可能性があります。getLastError(GLE)呼び出しは、GLE呼び出しを実行する接続で発生した最後の操作のステータスを返すだけです。

ただし、シェルを使用している場合、書き込み操作のたびに自動的にGLEが呼び出されるため、GLEはすでに呼び出されているため、通常はnullの結果が返されます。代わりに電話してみてくださいgetPrevError()-それがあなたが期待したものを返すかどうかを確認してください。

MongoDBドライバーは、接続がプールに返される前にGLEが呼び出され、この種の問題を回避するための操作の結果(またはエラー)として返されることを確認することで、これを処理します。

于 2012-11-08T10:15:54.603 に答える