0

コレクションのレコードを次のように更新しています。

for document in myDB.find():
    if compliesToSomeRule(document):
        myDB.update({'_id':document['_id']}, {'$set':{'something':'somevalue'}})

これはそれを行うための最も効率的な方法ですか?

_idインデックスを再クエリするので、更新の最初のパラメータをドキュメントのとして設定する必要があるのは奇妙に思えますか?

いわば「インプレース」で更新する方法はありますか?

4

4 に答える 4

1

作成する更新コマンドの最初のセクションは、基本的に「compliesToSomeRule」メソッドから必要なものです。たとえば、compliesToSomeRule が次のように定義されているとします。

def compliesToSomeResult(doc):
    if doc['a'] == 0:
        return True
    else:
        return False

次に、このセットをスキップして、単に行うことができます

myDB.update({ 'a' : 0 }, {'$set' : { 'x' : 'y' }})

これにより、更新ドキュメント (2 番目のドキュメント) がコレクション内のフィールド a が 0 のすべてのドキュメントに適用されます。

別の例: 'a' > 0 のすべてのドキュメントを検索する場合は、次のようにします。

myDB.update({ 'a' : { '$gt' : 0 }}, {'$set' : {'x' : 'y'}})

更新呼び出しの最初のセクションである「クエリ」セクションは、更新を受け取るドキュメントを指定する方法です。2 番目のセクションでは、更新が実際に何であるかを定義します。

この資料を確認する際に役立つドキュメントを次に示します: http://docs.mongodb.org/manual/applications/update/

于 2013-02-26T22:55:58.317 に答える
0

「$where」キーワードを見たいと思います。 http://docs.mongodb.org/manual/reference/operator/where/ JavaScript 関数に基づいてクエリを実行できるため、すべてがデータベース上で行われます。ただし、これは遅くなる可能性があります。

于 2013-02-26T23:08:05.960 に答える
0

その場で更新しています。update の最初の引数は find 句であり、更新するレコードを特定する方法です。

編集

MongoDB はキャッシュを処理しますか? はい。MongoDB は、最近使用されたすべてのデータを RAM に保持します。クエリのインデックスを作成し、作業データ セットが RAM に収まる場合、MongoDB はすべてのクエリをメモリから処理します。

MongoDB はクエリ キャッシュを実装しません。MongoDB はすべてのクエリをインデックスやデータ ファイルから直接提供します。


また、あなたのユーザー名は素晴らしいです:)

于 2013-02-26T16:17:07.457 に答える
-1

特定のドキュメントを見つけて何かを追加する必要がある場合:

    flag=db.foo.find({"_id":333})
    try: 
        if flag[0]['_id']:
            db.foo.update({"_id":333},{"$set":{"name":"mongo"}})
    except:
        print "none"

ただし、すべてのドキュメントを検索してすべてに何かを追加する必要がある場合:

flag=db.foo.find()
for row in flag:
    db.foo.update({"_id":flag['_id']},{"$set":{"name":"mongo"}})
于 2013-05-08T20:28:32.137 に答える