Unit has_many StationInstancesгруппа по Mongoid в/MongoDB
StationInstance belongs_to блок
Я хочу экземпляров группы станций по unit_id в Mongoid.
Каков будет запрос на получение всех экземпляров станции, сгруппированных по unit_id?
Unit has_many StationInstancesгруппа по Mongoid в/MongoDB
StationInstance belongs_to блок
Я хочу экземпляров группы станций по unit_id в Mongoid.
Каков будет запрос на получение всех экземпляров станции, сгруппированных по unit_id?
Вы можете сделать это напрямую, используя метод group (который внутренне уменьшает карту) в mongo, как вы это делали в 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});
}
В функции карты вы можете группировать unit_ id of StationInstance (поскольку он принадлежит единице, он будет иметь unit_id) и агрегирует его по счету. так как обычный счетчик не возвращает весь объект, мы явно возвращает идентификатор (или какой бы области или весь объект, просто this
) в StationInstance
reduce = function(k, values) {
var result = {count: 0, StationInstance: []};
values.forEach(function(value) {
result.count += value.count;
result.StationInstance.push(value.StationInstance);
});
return result;
}
и уменьшить мы посчитаем сгруппированных деталь, и поставить StationInstances в массив
наконец, выдавшего
db.StationInstance.mapReduce(map,reduce,{out: { inline : 1}})
вернется к желаемому результату
сделать это в mongoid, просто stringfiy
функции карта & уменьшить и использовать его как
StationInstance.collection.mapreduce(map,reduce,{:out => {:inline => 1},:raw=>true })
Он работал с некоторыми коррективами. Но неясно, что делает это '{: inline => 1}' и ': raw => true'? – Autodidact
@Millisami, inline - это опция вывода для уменьшения, означает, что она сообщает монго выполнить в памяти, не создавая никаких временных наборов тем, что подходит, если данные малы. проверьте ссылку для получения дополнительной информации http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-Outputoptions – RameshVel
В функции map мы испускаем 'unit_id' как' emit (this.unit_id, {count: 1 , StationInstance: this._id}); 'Что делать, если вместо' this.unit_id' я хочу получить заголовок единицы, который находится в модели документа unit? – Autodidact