这是交易.假设我们在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};
如果this.items.length == 5000甚至更多怎么办?我的RDBMS背景大声呼喊:
SELECT ... FROM ... WHERE whatever_id IN (over 9000 comma-separated IDs)
绝对不是一个好方法.
伙计们,谢谢你们的时间!
我希望最好的答案将是"你是愚蠢的,停止思考RDBMS风格,使用最新版本的MongoDB中的$ its_a_kind_of_magicSphere ":)