ここでは取引があります。我々はMongoDBの中に、以下のデータスキーマを持っているとしましょう:埋め込みが答えではない場合、MongoDBの多対多関係をどう扱うか?
items
:いくつかのデータを保持する大きな文書のコレクション(それが実際に何であるか絶対に無関係です)。item_groups
:item_groups.items
と呼ばれるitems._id
というリストを含むドキュメントを含むコレクション。
したがって、これらの2つは多対多の関係で結ばれています。しかし、難しいことが1つあります。特定の理由からアイテムグループ内にアイテムを格納できないため、タイトルと同様に埋め込みは答えではありません。
私が本当に心配している質問は、特定のアイテムを含む特定のグループを見つけることです(つまり、コレクションごとに基準を設定しています)。実際には、見つけられた各グループ内のアイテムがどれくらいの基準を満たしているかも言わなければなりません(アイテムがないということはグループが見つからないことを意味します)。私はこの思い付いた
唯一の実行可能な解決策は、これまでの機能を減らすダミーとアプローチを削減/地図を使用することです:
function map() {
// imagine that item_criteria came from the scope.
// it's a mongodb query object.
item_criteria._id = {$in: this.items};
var group_size = db.items.count(item_criteria);
// this group holds no relevant items, skip it
if (group_size == 0) return;
var key = this._id.str;
var value = {size: group_size, ...};
emit(key, value);
}
function reduce (key, values) {
// since the map function emits each group just once,
// values will always be a list with length=1
return values[0];
}
db.runCommand({
mapreduce: item_groups,
map: map,
reduce: reduce,
query: item_groups_criteria,
scope: {item_criteria: item_criteria},
});
問題ラインは次のとおりです。
item_criteria._id = {$in: this.items};
何本かの.items.length == 5000以上?私のRDBMSの背景には、大声で叫ぶ:
SELECT ... FROM ... WHERE whatever_id IN (over 9000 comma-separated IDs)
は間違いを行くには良い方法ではありません。
お時間をいただきありがとうございます。
私は最高の答えは「あなたは愚かだRDBMSスタイルで思考停止し、MongoDBの最新リリースから$ its_a_kind_of_magicSphereを使用する」のようなものことを願っています:)
...のMongoDB及びその他の文書データベースが得意な何かであるということです - > http://www.mongodb.org/display/DOCS/データベース+参照#DatabaseReferences - Javascript%28mongoshell%29? – DrColossos
私は、実際の埋め込みすなわち別のドキュメント内に1つのドキュメントを格納することについて話しています。例えばコメント= {ユーザー: 'DrColossos'、テキスト: 'あなたは何を話していますか?';質問= {x:13、y:42、コメント:[コメント]} –
中間テーブルを使用して多対多リレーションシップを作成し、それをクエリすると、あなたの問題を解決することはありませんか? – Qqbt