python:挿入しない場合が存在する
-
25-09-2019 - |
質問
毎日を受けてい株式の書類(た。何をしたいのは挿入し各項目にないものはすでに存在しています。
- また、私の初めて挿入しまい、最後に見たします。
- いて重複した。
- ならないようにしたい削除資産担保証券買入スキームは以前に保存されていな私です。
- 95%(推定)の記録を更しております。
私が使っているPythonのドライバー(pymongo).
私が現在な(擬似コード):
for each document in update:
existing_document = collection.find_one(document)
if not existing_document:
document['insertion_date'] = now
else:
document = existing_document
document['last_update_date'] = now
my_collection.save(document)
私の問題であることが非常に遅い(40分以上100,000円を記録、数百万のアップデート)いいものがありが組み込みを行っていますが、文書を更新()はmmmhhh....ビットエッセイは英語で書....(http://www.mongodb.org/display/DOCS/Updating )
できる人におかれが早い?
解決
あなたが「アップサート」をやりたいように聞こえます。 MongoDBは内蔵されており、このためのサポート。 {アップサート:真}あなたの更新()の呼び出しに余分なパラメータを渡します。たとえばます:
key = {'key':'value'}
data = {'key2':'value2', 'key3':'value3'};
coll.update(key, data, upsert=True); #In python upsert must be passed as a keyword argument
これは完全にあなたの-見つけた場合、他の更新ブロックを置き換えます。これは、キーが存在しない場合は挿入されますと、それがない場合は更新されます。
前:
{"key":"value", "key2":"Ohai."}
後:
{"key":"value", "key2":"value2", "key3":"value3"}
また、あなたは書きたいデータを指定することができます:
data = {"$set":{"key2":"value2"}}
これで、選択した文書は他のみと休暇はすべてそのまま「KEY2」の値を更新します。
他のヒント
のMongoDB 2.4の時点で、あなたは$ setOnInsert( HTTPを使用することができます。 mongodb.org/manual/reference/operator/setOnInsert/する)
$ setOnInsertとを使用して設定 'insertion_date' 'LAST_UPDATE_DATE' あなたのアップサートコマンドで$セットを使用します。
作業例にあなたの擬似コードを有効にするには:
now = datetime.utcnow()
for document in update:
collection.update_one(
{"_id": document["_id"]},
{
"$setOnInsert": {"insertion_date": now},
"$set": {"last_update_date": now},
},
upsert=True,
)
あなたはいつもMongoDBの保存、競合を拒否するようになり、一意のインデックスを作ることができます。 MongoDBのシェルを使用して行う以下の点を考慮ます:
> db.getCollection("test").insert ({a:1, b:2, c:3})
> db.getCollection("test").find()
{ "_id" : ObjectId("50c8e35adde18a44f284e7ac"), "a" : 1, "b" : 2, "c" : 3 }
> db.getCollection("test").ensureIndex ({"a" : 1}, {unique: true})
> db.getCollection("test").insert({a:2, b:12, c:13}) # This works
> db.getCollection("test").insert({a:1, b:12, c:13}) # This fails
E11000 duplicate key error index: foo.test.$a_1 dup key: { : 1.0 }
あなたは$ setOnInsert演算子とアップサートを使用することができます。
db.Table.update({noExist: true}, {"$setOnInsert": {xxxYourDocumentxxx}}, {upsert: true})
1。使用を更新。
使用更新、上記の代わりに、セーブ・ヴァン・グエンの答えから描きます。これは、あなたUPSERTオプションへのアクセスを提供します。
注:ドキュメントから(見つけたとき、このメソッドは、文書全体を上書きしますに)
var conditions = { name: 'borne' } , update = { $inc: { visits: 1 }} , options = { multi: true };
Model.update(conditions, update, options, callback);
function callback (err, numAffected) { // numAffected is the number of updated documents })
1.A。使用$セット
あなたは、ドキュメントの選択を更新する場合ではなく、全部、あなたはアップデートで$設定方法を使用することができます。 (再び、ドキュメントにより)... だから、あなたが設定したい場合は...
var query = { name: 'borne' }; Model.update(query, ***{ name: 'jason borne' }***, options, callback)
...
としてそれを送りますModel.update(query, ***{ $set: { name: 'jason borne' }}***, options, callback)
このは{ name: 'jason borne' }
とドキュメント(S)の全てを上書き誤っ防ぐことができます。
私はMongoDBのサポートを選択upsertingのこのタイプを考えていません。私はLeMizと同じ問題を抱えている、との更新(基準、NEWOBJ、アップサート、マルチ)のを使用すると、A「を作成」の両方に対処し、タイムスタンプ「更新」の右のときは動作しません。次UPSERT文を考える:
update( { "name": "abc" },
{ $set: { "created": "2010-07-14 11:11:11",
"updated": "2010-07-14 11:11:11" }},
true, true )
シナリオ#1 - 「ABC」の「名前」を持つドキュメントが存在しません: 新しい文書は '名前' = 'ABC'、 '作成' = 2010-07-14午前11時11分11秒、および= 2010年7月14日午前11時11分11秒 '更新' を使用して作成されます。
シナリオ#2 - 「名前」との文書の「ABC」は既に次ので存在します: 「名前」=「ABC」、= 2010年7月12日9時09分09秒「を作成」、および= 2010年7月13日10時10分10秒「更新」。 アップサート後、文書は現在、シナリオ#1の結果と同じになります。そこ挿入する場合のフィールドが設定されてアップサートに指定する方法はませんし、そのフィールドの更新場合は放置されています。
私の解決策は、のcritera のフィールド、挿入を実行し、その直後に単に「更新」フィールドに更新を実行ます。に一意索引を作成するには、でした
概要
- きの既存コレクションを記録しています。
- セットの記録を含むの変更は、既存の記録です。
- 一部の更新なオブジェクトの大きさの変更当たっ重複したいです。
- すべての更新が同じ分野があるので、その値が異なります。
- したいトラックが記録した最後の変更、価値を実際に変更されます。
注っ仮PyMongo変更に合わせて非常に高い効果をもたらします。
方法:
のコレクションの指標とな=trueで得られないときには、いくつかの重複記録です。
に対して繰り返し処理を実行にご入力の記録、バッチの15,000記録です。各記録のバッチを作成して辞を構成するしたいデータをパソコンのスロットに挿入し仮に、一人ひとりがきたことは記録を伸ばしていきました。追加する'、'作成'と'更新'タイムスタンプになれます。このとして、バッチinsertコマンドのContinueOnError'フラグ=trueの挿入のあとは起こるものがあれば、複製キーができるようにも思えますねり)になります。このことが起こるのである。バルクロックを挿入しますっていただき15k/秒ていきます。さらに上の注意ContinueOnError、 http://docs.mongodb.org/manual/core/write-operations/
記録を挿入しますがスピードは速いので、きっと挿入できます。その更新に関連する記録です。ってこんな風にしてバッチ検索ります。
に対して繰り返し処理を実行すべての入力記録再度、バッチの15Kいます。エキスのキー(bestのがありま鍵ができなかった場合はありません).取得するこのバンチの記録からのもんごういかとdbです。collectionNameBlah.find({分野:{$る:[1,2,3...})を返します。これらに記録する場合があり、更新、その場合、発行、更新、更新の更新'時刻です。
残念ながら、おPython2.4以下が含まれていないバルクの更新動作します。ね合います。
キー最適化のポイント:
- の挿入が大きくスピードを運営しております。
- 検索記録一斉すく速度が上昇するでしょう。
- 個別のアップデートのルートが10Genが取り組んでいます。おそらく、これに2.6なくなった場合は終了となりますのでそれが多くのものになってその統制)。
一般的には、アップデートを使用すると、私は確信してどのように仕事にあなたのpythonアダプタを使用している。
じゃないけれども、それだけで文書を作成するようにMongoDBに優れています第二に、あなただけの唯一の数はおそらく不要なトラフィックを引き起こし、あなたのMongoDBから文書全体を転送find_oneより良いオプションになりますどの戻ります。
)(カウント、文書が存在していることかどうかを知る必要がある場合