更新MongoDBの無い繰り返しサブドキュメント+ +ページングクエリ
私の友人の多くは、MongoDBのプロセスの使用についての質問の様々なを持っています。たとえば、次のようにどのように効率MongoDBのアップデートを向上させるには?MongoDBのページネーションの問い合わせでサブドキュメント(ストレージアレイなど)を達成する方法
この記事では、これらの散乱機能の集約点となると、あなたの参考のために達成するためにデモをしただろう。
一つは、最初のMongoDBの下の更新を理解し、MongoDBの更新方法は、2つのカテゴリです:保存()とupdate()
説明公式の更新方法:https://www.runoob.com/mongodb/mongodb-update.html
ここでの必要性は、更新方法更新()クラスです。
すぐにその問い合わせのMongoDBの利点は、すべてのデータが単一の文書の形式で格納され、その多くは、データの量に何百万またはレコードのさえ数百億あり、いくつかの複雑な文書は、サブ文書の内容の配列を含んでいます、(通常は複数のデータと同様の構成)。事業は、(保存のみを行った場合、文書内のサブ文書の追加記録を行う必要がある)場合や、アップデートの更新()操作は、本文につながるとき。:
1.予備方法:我々はアップデートを使用することを選択したカテゴリ()の更新方法
初期データ構造を挿入します。
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123"
}
]
}
保存():既存のドキュメントducument文書に代わる新しい文書を再作成することです、
アップデート():オリジナル文書内で直接ようなフィールドの内容を更新する(効率を向上させるのが、特定の問題、以下の詳細な分析がある)されます。
插入: "コメント":[{ "NUM1": "124"}]。
結果を得るために希望を挿入した後:
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123"
},
{
"num1" : "124"
}
]
}
使用更新()、元のフィールド "コメント":[{ "NUM1": "123"}]、更新がされた後、 "コメント":[{ "NUM1": "124"}]
実際の結果:
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "124"
}
]
}
このテキストは、我々はコメントフィールドの後に更新された二つのレコードを持つことができることは最初明らかである:「コメント」:[{「NUM1」:「123」}、{「NUM1」:「124」}]
update()メソッドを使用するので、単純なことができ、完全には適用されない場合、更新方法の最適化の次のステップ。
2。$プッシュサブ配列関数に記録されている追加の文書を使用して達成することができます。
db.getCollection.update({_ ID: "1.ch"}、{$プッシュ:{コメント:[{ "NUM1": "124"}]}})
"コメント":[{ "NUM1": "123"}、{ "NUM1": "124"}]結果:最初の操作後
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123"
},
{
"num1" : "124"
}
]
}
この動作を繰り返す場合しかし、記録が同一の記録挿入繰り返される(制限なし)
"コメント":[{ "NUM1": "123"}、{ "NUM1": "124"}、{ "NUM1": "124"}、{ "NUM1": "124"}、{ "NUM1"。 "124"}]。
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123"
},
{
"num1" : "124"
},
{
"num1" : "124"
},
{
"num1" : "124"
},
{
"num1" : "124"
}
]
}
これを達成することはできませんが、まだ繰り返し(失われたデータは、データの冗長性を持っていますが、同じ記録挿入または更新操作を繰り返す必要はありません避けるために、更新データのバッチ)要求を更新せずに更新され、本実施形態で必要とされます。我々はまた、さらにupdate()メソッドを選択する必要がありますので、
3. $ addToSet:レコードの配列の存在が更新されていないで、逆に挿入し更新:
db.getCollection.update({_ ID: "1.ch"}、{$ addToSet:[{ "NUM1": "124"}]}})
"コメント":[{ "NUM1": "123"}、{ "NUM1": "124"}]第一の操作後、
"コメント":[{ "NUM1": "123"}、{ "NUM1": "124"}]繰り返し操作残る結果
したがって、我々は、UPDATE文データの更新として選択({_ ID: "1.ch"}、{$ addToSet:[{ "NUM1": "124"}]}})。
今、データが更新するための最良の方法となっている、次のステップは、文書がページングクエリを実装する配列、およびクエリは、まだ効率的にMongoDBを保証することができる方法です。
第二に、インデックス選択
ここでは、最初の問題を考慮する必要があります。百万人以上のレベルのデータがどのような構造です。
例えば:
最初のケース:千万フローレコードの合計が水アカウントです、各アカウントは百万水位を持っています。この時点で、より多くの共同インデックスの使用を検討するためのインデックスを選択する必要があります。
後者の場合:水はまた千万レコードを持っていますが、10,000以上までの各アカウントの下で水ながら、数千または数百万もの何百ものアカウントが存在します。このようなデータクエリ応答時間は依然としてミリ秒レベルの応答時間を提供することができるので、インデックスがまだ一意のインデックス(_id)を使用する選択された時間は、とすることができます。
3:ページングクエリ
あなたは良いインデックスを選択した後、我々は、サブ文書の配列をクエリページング開始しました:
テストするためのデータの一部を挿入します。
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123",
"num2" : "00R33",
"date" : "2020-01-16 : 14:32:00",
"flag" : "2"
},
{
"num1" : "124",
"num2" : "00R34",
"date" : "2020-01-16 : 14:32:00",
"flag" : "2"
},
{
"num1" : "125",
"num2" : "00R35",
"date" : "2020-01-16 : 14:32:00",
"flag" : "1"
},
{
"num1" : "126",
"num2" : "00R36",
"date" : "2020-01-16 : 14:32:00",
"flag" : "1"
}
]
}
ページングクエリを使用します。
db.getCollection.find({_ ID: "1.ch"}、{ "コメント":{ "$スライス":[0,2]}})
クエリ結果:
{
"_id" : "1.ch",
"no" : "1"
"company" "ch"
"name" : "小明",
"comments" : [
{
"num1" : "123",
"num2" : "00R33",
"date" : "2020-01-16 : 14:32:00",
"flag" : "2"
},
{
"num1" : "124",
"num2" : "00R34",
"date" : "2020-01-16 : 14:32:00",
"flag" : "2"
}
]
}
コメント:ニーズが完了サブページング文書であると{「$スライス」:[0,2]}クエリをページング、0は開始位置、2は、クエリの数ですか
これらは、私たちがコメント歓迎のMongoDBの使用を議論し、改善し、彼の本当の心配だったです