【发布时间】:2011-10-22 20:10:54
【问题描述】:
这是交易。假设我们在 MongoDB 中有以下数据模式:
-
items:一个包含一些数据的大型文档的集合(这与它实际上是什么完全无关)。 -
item_groups:一个集合,其中包含一个名为items._id列表的文档,称为item_groups.items以及一些额外的数据。
因此,这两者通过多对多关系联系在一起。但是有一件棘手的事情:出于某种原因,我不能将项目存储在项目组中,所以——正如标题所说——嵌入不是答案。
我真正担心的查询旨在查找包含某些特定项目的特定组(即,我为每个集合设置了一组标准)。事实上,它还必须说明每个找到的组中有多少项符合标准(没有项意味着未找到组)。
到目前为止,我想出的唯一可行的解决方案是使用带有虚拟 reduce 函数的 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};
如果 this.items.length == 5000 甚至更多怎么办?我的 RDBMS 后台大声呼喊:
SELECT ... FROM ... WHERE whatever_id IN (over 9000 comma-separated IDs)
绝对不是个好办法。
非常感谢你们的宝贵时间,伙计们!
我希望最好的答案是“你太傻了,别再用 RDBMS 风格思考了,使用最新版本 MongoDB 中的 $its_a_kind_of_magicSphere”:)
【问题讨论】:
-
当谈论“嵌入”时,您是在谈论 DBReferences --> mongodb.org/display/DOCS/…?
-
我说的是实际嵌入,即将一个文档存储在另一个文档中。例如comment = {user: 'DrColossos', text: '你在说什么?'};问题 = {x: 13, y: 42, cmets: [comment]}.
-
如果您使用中间表创建多对多关系并进行查询?这不能解决你的问题吗?
标签: mongodb