如何在mongoose中使用Group by?

时间:2017-04-17 18:35:41

标签: javascript node.js mongodb mongoose

我的收藏品名为“列表”,其中包含 metadata status 等字段。元数据是一个包含 user 对象的对象, status 是一个字符串。

结构如下所示,

  

{“status”:“有效”,“元数据”:{       “user”:{         “urlProfile”:“”,         “averageRating”:5,         “reviewCount”:2,         “userId”:“1244324”       }}

现在,状态字段包含 "Active" "Inactive" 等值。我需要按这些状态进行分组并按userId进行过滤。所以我在帮助器中有一个函数,如下所示,

 query: function (model, conditon, options) {
            console.log(conditon, options);
            return new Promise(function (resolve, reject) {
                options = options || {};

                model.find(conditon, {}, options).exec(function (error, data) {
                    if (error) {
                        reject(error);
                    }
                    resolve(data);
                })
            })
        }

问题是我如何通过用户ID传递组并查询所需的数据。现在我的查询部分看起来像这样,

return dbService.query(sellerModel, {
                    'metadata.user.userId': userIdRetrieved
                }, {});

我怎样才能按条件通过小组?我找了样品,到现在为止都找不到任何解决方案。

样本集 enter image description here

预期输出:

[{
  "Status": "Active",
  "Results": {
    "user": {
      "urlProfile": "",
      "averageRating": 5,
      "reviewCount": 2,
      "userId": "1244324"
    }
  }
}
,
{
  "Status": "InActive",
  "Results": {
    "user": {
      "urlProfile": "",
      "averageRating": 5,
      "reviewCount": 2,
      "userId": "1244324"
    }
  }
}]

1 个答案:

答案 0 :(得分:2)

要获得所需的输出,您需要使用 aggregate 方法,因为它提供了允许您聚合文档并返回所述结果的运算符。

考虑构建一个由 $group 阶段组成的管道,您可以通过 $avg 累加器汇总平均评分,{{ 1}}使用 $sum 以及使用 $first $last 的群组中的其他字段。按键分组是一个子文档,其中包含两个字段Status和userId。

最后的 $project 步骤可让您将上述组聚合的输出重新整形为所需的表单, aggregate() 方法返回然后,您可以调用 exec() 来获取Promise

要解释上述框架,请遵循以下示例:

reviewCount