私はmongodbのいくつかのデータを更新したいのですが、私のロジックは次のとおりです:
#find the specific document with "md5,time,size",
if collection.find({"src_md5":file_md5,"src_time":file_time,"src_size":file_size}).count() == 0:
#if not found
# find the idx,if idx is not yet exist,set idx equa 1
if collection.find({},{"idx":1}).count() == 0:
idx = 1
#if idx is alread there, sort idx and get the biggest idx
else:
idx = collection.find({},{"idx":1}).sort('idx',-1).limit(5)[0]['idx']
idx = idx + 1
#insert the info with idx
if not self.insertFileInfo(collection,file_obj,file_md5,file_time,file_size,long(idx)):
return None
#if the specific document with "md5,time,size" is found
else:
#just get the idx with the specific md5
idx = collection.find({"src_md5":file_md5,"src_time":file_time,"src_size":file_size},{"idx":1})[0]['idx']
return None
上記のコードを 4 台のマシンで実行します。これは、4 つのプロセスがほぼ同時に mongodb を更新することを意味します。操作のアトミック性を確保するにはどうすればよいですか? 私の記録されたスキーマは
{"src_md5":"djapijfdakfiwqjfkasdj","src_size":2376498,"src_time":1338179291,"idx":1}
{"src_md5":"jdfipajkoijjipjefjidwpj","src_size":234876323,"src_time":1338123873,"idx":2}
{"src_md5":"djapojfkdasxkjipkjkf","src_size":3829874,"src_time":1338127634,"idx":3}
これは単純な自動インクリメント キーではなく、md5、サイズ、時間が変更されたときに増加し、レコードとして挿入する必要があります。{"src_md5","src_time","src_size"} に複合一意インデックスを作成し、{"idx"} に一意インデックスを作成しますが、新しい情報を挿入する前に、idx が既に存在するようにしてから、値を増やしますそれ。2 つの状況があります: 1,特定の md5,size,time を持つ idx が既に存在する場合は、単に idx を返します 2,存在しない場合は、idx を 1 増やします