这是交易.假设我们在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},
});
Run Code Online (Sandbox Code Playgroud)
问题在于:
item_criteria._id = {$in: this.items};
Run Code Online (Sandbox Code Playgroud)
如果this.items.length == 5000甚至更多怎么办?我的RDBMS背景大声呼喊:
SELECT ... FROM ... WHERE whatever_id IN (over 9000 comma-separated IDs)
Run Code Online (Sandbox Code Playgroud)
绝对不是一个好方法.
伙计们,谢谢你们的时间!
我希望最好的答案将是"你是愚蠢的,停止思考RDBMS风格,使用最新版本的MongoDB中的$ its_a_kind_of_magicSphere ":)
为什么不使用相反的设计呢?
您正在存储项目和 item_groups。如果您的第一个想法是将项目存储在 item_group 条目中,那么相反的想法也许也不错:-)
让我解释:
在每个项目中,您存储它所属的组。(您在 NOSql 中,数据重复是可以的!)例如,假设您在项目条目中存储一个名为 groups 的列表,并且您的项目如下所示: { _id : .... , name : .... , groups : [对象 ID(...)、对象 ID(...)、对象 ID(...)] }
那么 MapReduce 的想法就需要很大的力量:
map = function() {
this.groups.forEach( function(groupKey) {
emit(groupKey, new Array(this))
}
}
reduce = function(key,values) {
return Array.concat(values);
}
db.runCommand({
mapreduce : items,
map : map,
reduce : reduce,
query : {_id : {$in : [...,....,.....] }}//put here you item ids
})
Run Code Online (Sandbox Code Playgroud)
您可以添加一些参数(例如最终确定以修改映射减少的输出),但这可能会对您有所帮助。
当然,如果您需要的话,您需要另一个集合来存储 item_groups 的详细信息,但在某些情况下(如果有关 item_groups 的信息不存在,或者不更改,或者您不关心您不这样做)没有最新版本)您根本不需要它们!
这是否给您提供了解决问题的提示?
| 归档时间: |
|
| 查看次数: |
1876 次 |
| 最近记录: |