这是交易。让我们假设我们有以下数据模式在MongoDB中:当嵌入不是答案时如何处理MongoDB中的多对多关系?
items
:与保存一些数据(这绝对是无关紧要它实际上是什么)大型文档的集合。item_groups
:一个包含items._id
列表的文档的集合,称为item_groups.items
加上一些额外的数据。
所以,这两个是有许多对许多关系绑在一起。但有一个棘手的问题:由于某种原因,我无法在项目组中存储项目,所以 - 就像标题所说 - 嵌入不是答案。
我真的很担心的查询旨在找到一些包含某些特定项目的特定组(即,每个集合都有一组标准)。实际上,它也必须说明每个找到的组中有多少项符合标准(没有项目表示组未找到)。
我想出了这个问题的唯一可行的解决方案远远是使用一个Map/Reduce的方式与虚拟减少功能:
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风格,使用$ its_a_kind_of_magicSphere从MongoDB的最新发布的” :)
在谈到“嵌入”你在说什么DBReferences - > http://www.mongodb.org/display/DOCS/数据库+参考#DatabaseReferences-的Javascript%28mongoshell%29? – DrColossos
我正在谈论实际的嵌入,即将一个文档存储在另一个文档中。例如评论= {用户:'DrColossos',文本:'你在说什么?'};问题= {x:13,y:42,评论:[评论]}。 –
如果使用中间表创建多对多关系并查询它?不会解决你的问题? – Qqbt