我在mongo中有一堆文件,结构如下:
{
"_id" : "",
"number" : 2,
"colour" : {
"_id" : "",
"name" : "Green",
"hex" : "00ff00"
},
"position" : {
"_id" : "",
"name" : "Defence",
"type" : "position"
},
"ageGroup" : {
"_id" : "",
"name" : "Minor Peewee",
"type" : "age"
},
"companyId" : ""
}
我目前正在使用Mongo的聚合来按ageGroup.name对文档进行分组,返回:
//Query
Jerseys.aggregate([
{$match: { companyId: { $in: companyId } } },
{$group: {_id: "$ageGroup.name", jerseys: { $push: "$$ROOT" }} }
]);
//returns
{
_id: "Minor Peewee",
jerseys: array[]
}
但我希望它也按年龄组中的position.name分组。即:
{
_id: "Minor Peewee",
positions: array[]
}
//in positions array...
{
_id: "Defence",
jerseys: array[]
}
// or ageGroups->positions->jerseys if that makes more sense.
我尝试了多个小组,但我不认为我正确地设置了这些小组我似乎总是得到一系列的_id。我使用Meteor作为服务器,并且我在流星方法中使用Meteor。
答案 0 :(得分:5)
您可以在第一个分组阶段使用复合聚合function hide_all_and_show_one(elem_to_show){
var all = ['couponTable', 'companyTable', 'customerTable',
'successLog', 'couponJointTable'];
all.forEach(function(val){ $scope[val] = false; });
$scope[elem_to_show] = true;
}
$scope.tab = 1;
$http.get("http://localhost:8080/CouponWebService1/rest/admin/getAllCoupons")
.then(function(response){ $scope.coupons = response.data; });
$http.get("http://localhost:8080/CouponWebService1/rest/admin/getAllCompanies")
.then(function(response){ $scope.companies = response.data; });
$http.get("http://localhost:8080/CouponWebService1/rest/admin/getAllCustomers")
.then(function(response){ $scope.customers = response.data; });
hide_all_and_show_one('couponTable');
$scope.select = function(setTab) {
$scope.tab = setTab;
if (setTab === 2){
hide_all_and_show_one('companyTable');
}
else if (setTab === 3){
hide_all_and_show_one('customerTable');
}
else{
hide_all_and_show_one('couponTable');
}
};
$scope.isSelected = function (checkTab) {
return ($scope.tab === checkTab);
}
。
然后,您可以将其中一个键用作最终聚合的“主”_id
,将另一个键_id
用作另一个数组。
$push