0

参考までにpymongoを使用しています。

したがって、このようなドキュメントがある場合:

{
    'name': 'bill',
    'color': 'blue',
    'subdocument': {
        'title': 'Untitled',
        'content': 'Hello World',
    }
}

このドキュメントがdb.users.find()[0]を実行しているのを見つけて、それを更新する引数として渡すと、サブドキュメントを削除しない限り、Mongoは更新するドキュメントを見つけられません。サブドキュメントが削除されない限り、見つかったドキュメントをfind_oneに渡すことも失敗します。

ロックを最適化するために、すべてのフィールドを指定する必要があります。ドキュメントを簡単に取得して更新し、変更されていないための要件として元のフィールドを渡すにはどうすればよいですか?

4

3 に答える 3

1

私は主に楽観的ロックの目的でこれに興味を持っていたので、 MongoDBユーザーグループのScottのおかげで、最初の試みよりも優れた解決策を見つけました。

解決策は、「バージョン」カウンターフィールドを使用し、フィールドが変更されていない場合にのみ更新することです。ドキュメントが更新されるたびに、更新を実行するクエリはカウンターをインクリメントする必要があります。 変更を加えるためにすべてのフィールドをスキャンして比較する必要がないため、これはより高速です。

于 2012-04-18T15:13:33.240 に答える
0

MongoDBで深刻なバグが発生していると思います。このバグでも同様の問題が発生する可能性があります。

埋め込まれたドキュメントは、ドキュメントとして比較されるのではなく、バイナリとして比較されます。ですから、そうではないはずなのにとsubdocument: {a:1,b:2}は異なります。subdocument:{b:2,a:1}

これが問題になる理由については、このコメントを参照してください。

もちろん、その最初のバグは深刻であり、1年以上前のものであるため、これがすぐに修正されるかどうかは疑わしいです。実際、それは現在予定されていません。

于 2012-04-17T19:11:41.907 に答える
0

'$ set'という用語を入れましたか?

これが私がしたことです:

d = {
    '名前':'請求書'、
    '青色'、
    'サブドキュメント':{
        'タイトル':'無題'、
        'content':'Hello World'、
    }
}

db.name.insert(d)
f = db.name.find_one({'name':'bill'})
印刷f
{u'color':u'blue'、u'_id':ObjectId( '4f8dbc834647df1428000002')、u'name':u'bill'、u'subdocument':{u'content':u'Hello World'、 u'タイトル':u'無題'}}

db.name.update(f、{'$ set':{'name':'fred'}})

f = db.name.find_one({'name':'fred'})
印刷f
{u'color':u'blue'、u'_id':ObjectId( '4f8dbc834647df1428000002')、u'name':u'fred'、u'subdocument':{u'content':u'Hello World'、 u'タイトル':u'無題'}}
于 2012-04-17T19:16:16.037 に答える