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

mongoでドキュメントを条件付きでアップサートするにはどうすればよいですか?

    すべてをアトミックに実行できることを除けば、変更を加えたい既存の条件は2種類あり、それぞれをアトミックに処理できます。

    • キーのレコードが存在しません
    • キーのレコードが存在し、そのupdate_time new_timeよりも古い

    キーの既存のレコードを更新します:

    def update_if_stale(key, new_value, new_time):
        collection.update({'key': key,
                           'update_time': {'$lt': new_time}
                           },
                          {'$set': {'value': new_value,
                                    'update_time': new_time
                                    }
                           }
                          )
    

    キーのレコードが以前に存在しなかった場合に挿入します:

    def insert_if_missing(key, new_value, new_time):
        collection.update({'key': key},
                          {'$setOnInsert': {'value': new_value,
                                            'update_time': new_time
                                            }
                           },
                          upsert=True
                          )
    

    $setOnInsert MongoDB 2.4で追加されました)

    それらを組み合わせて、必要なものを取得できる場合があります。例:

    def update_key(key, new_value, new_time):
        insert_if_missing(key, new_value, new_time)        
        update_if_stale(key, new_value, new_time)
    

    ただし、システムで可能な削除/挿入の時間スケールによっては、複数の呼び出し(更新/挿入/更新)またはその他の手段が必要になる場合があります。

    余談ですが、update_timeが欠落しているレコードが必要な場合 更新する古いレコードとして扱われるフィールド。{'$lt': new_time}}を変更します。 to {'$not': {'$gte': new_time}}



    1. MongoDBエンドレスFindToListAsync

    2. MongoDBデータディレクトリ/data/dbが見つかりません

    3. マングースデータベースモジュールのエクスポート

    4. MongoDB削除トリガーのクエリ