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

Mongodbは限られた数のドキュメントを更新します

    Sammayeによると、これを行うための「適切な」方法があるようには見えません。私の回避策は、mongoサイトで概説されているシーケンス コレクション内のすべてのレコードに「seq」フィールドを追加するだけです。これで、更新するために確実にソートできる一意のフィールドができました。

    ここでは、確実にソート可能であることが重要です。自動生成された_idで並べ替えるつもりでしたが、自然な順序はObjectIdの昇順と同じではないことにすぐに気付きました(このページ 文字列値は、テストで観察した動作と一致するオブジェクト値よりも優先されるようです)。また、レコードをディスク上に再配置することも完全に可能であるため、自然な順序は並べ替えの信頼性が低くなります。

    これで、包括的開始点を取得するためにまだ更新されていない最小の「seq」を持つレコードを照会できます。次に、「seq」が開始点よりも大きいレコードをクエリし、更新するレコードの数をスキップします(ドキュメントを削除する場合など、「seq」がまばらになる可能性があるため、スキップすることが重要です)。そのクエリに1の制限を設定すると、包括的でないエンドポイントが得られます。これで、「updated」=0、「seq」> =開始点、<終了点のクエリで更新を発行できます。他のスレッドが私を打ち負かしていないと仮定すると、更新によって私が望むものが得られるはずです。

    手順は次のとおりです。

    1. findAndModifyを使用して自動インクリメントシーケンスを作成します
    2. 自動インクリメントシーケンスを使用するフィールドをコレクションに追加します
    3. 適切な開始点を見つけるためのクエリ:db.xx.find({updated:0})。sort({seq:1})。limit(1)
    4. 適切なエンドポイントを見つけるためのクエリ:db.xx.find({seq:{$ gt:startSeq}})。sort({seq:1})。skip(updateCount).limit(1)
    5. 開始点と終了点を使用してコレクションを更新します:db.xx.update({updated:0、seq:{$ gte:startSeq}、seq:{$ lt:endSeq}、$ isolated:1}、{updated :1}、{multi:true})

    かなり苦痛ですが、それで仕事は終わります。




    1. SQLで列のデータ型を確認する方法

    2. フレーズmongodbの複数のオカレンスを置き換える方法

    3. Mongo<3.2と集約された演算子$arrayElemAt

    4. Mongo、IDのリストから検索