使用$ group两次的Mongodb Aggregate

时间:2016-05-10 17:01:58

标签: mongodb meteor

我在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。

1 个答案:

答案 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