gpt4 book ai didi

mongodb - 在 mongoid/mongodb 中分组

转载 作者:可可西里 更新时间:2023-11-01 10:44:45 26 4
gpt4 key购买 nike

Unit has_many StationInstances

StationInstance belongs_to unit

我想在 mongoid 中按 unit_id 对站实例进行分组。

获取按 unit_id 分组的所有站点实例的查询是什么?

最佳答案

您可以直接使用 group 执行此操作mongo 中的(内部是一个 map reduce)方法,就像您在 sql 中所做的那样。代码是

  db.StationInstance.group({key:{unit_id:true},
cond:{},
reduce:function(a,b){b.sum++;},
initial:{sum:0}});

这将只返回计数

>> [ { "unit_id" : xxxx, "sum" : 1 }, { "unit_id" : zzzzz, "sum" : 2 } ]

但是您不能随它获取 StationInstance 项目

相反,您可以使用 MongoDB 执行此操作 map-reduce .. 检查下面的代码

map = function() { 
emit(this.unit_id,{count:1,StationInstance:this._id});
}

在 map 函数中,您可以按 StationInstance 的 unit_id 进行分组(因为它属于单元,它将具有 unit_id),并按计数聚合。由于普通计数不返回整个对象,我们显式返回 StationInstance

的 ID(或仅通过 this 的任何字段或整个对象)
reduce = function(k, values) {
var result = {count: 0, StationInstance: []};
values.forEach(function(value) {
result.count += value.count;
result.StationInstance.push(value.StationInstance);
});
return result;
}

在 reduce 中,我们计算分组的项目,并将 StationInstances 放入数组中

终于发布了

 db.StationInstance.mapReduce(map,reduce,{out: { inline : 1}})

会返回想要的结果

mongoid 中执行此操作,只是 stringfiy 函数 map & reduce 并像使用它一样

StationInstance.collection.mapreduce(map,reduce,{:out => {:inline => 1},:raw=>true })

关于mongodb - 在 mongoid/mongodb 中分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8699165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com