sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:一括操作は全体としてoplogに書き込まれますか?

    結果を見たことがないことを認める一般的な警告とともにこれに入りますが、基本的な原則は最初から私には有効であるように思われます。

    ここで考慮する必要があるのは、一般的な呼び出しで提示される「優れたシンタックスシュガー」の「内部で実際に起こっていること」です。これが意味するのは、基本的に、呼び出している操作の「コマンド形式」が実際に何をするかを調べることです。この場合、"更新"

    したがって、そのリンクをすでに確認している場合は、次の"Bulkを検討してください。 " 更新フォーム:

    var bulk = db.collection.initializeOrdedBulkOp();
    
    bulk.find({ "_id": 1 }).updateOne({ "$set": { "a": 1 } });
    bulk.find({ "_id": 2 }).updateOne({ "$set": { "b": 2 } });
    
    bulk.execute();
    

    これで、これが oneとしてサーバーに送信されていることがわかりました。 リクエストですが、あなたが考慮していない可能性が高いのは、「内部で」行われた実際の「リクエスト」は実際にはこれであるということです:

    db.runCommand({
        "update": "collection",
        "updates": [
            { "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } },
            { "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
        ],
        "ordered": true
    })
    

    したがって、「更新」操作の下でログに実際に表示されるのは、実際には次のようなものであるのは当然のことです(完全な出力からクエリのみに省略):

    { "q": { "_id": 1 }, "u": { "$set": { "a": 1 } } }
    { "q": { "_id": 2 }, "u": { "$set": { "b": 2 } } }
    

    したがって、関連するコマンドを含むこれらの各アクションは、レプリケーションおよび/またはoplogエントリの具体的な「再生」など、実行する可能性のある他のアクションの「再生」のoplogに含まれることを意味します。

    ドライバーが実際の呼び出しを実装する方法を知っているので、それが実際に見なくても実際に起こることであると確信しています。各呼び出しがこのようにoplog内に保持されることは理にかなっています。

    したがって、「全体として」、それではありません。これらは「トランザクション」ではなく、送信と返送が単一のリクエスト内にある場合でも、常に別個の操作です。しかし、それらはそうではありません 単一の操作であるため、そのように記録することはできません。




    1. MongoDB:配列フィールドに要素が含まれているかどうかを確認するにはどうすればよいですか?

    2. / sidekiqルートをパスワードで保護するにはどうすればよいですか(つまり、Sidekiq ::Webツールの認証が必要です)?

    3. MongoDBで文字列の日付をISOの日付に変更しますか?

    4. MongoDB集約フレームワーク$subtract