我有一个名为“listing”的集合,其中包含 metadata
和 status
等字段。 metadata 是一个包含 user
对象的对象,status
是一个字符串。
结构看起来是这样的,
{ "status": "Active", "metadata": { "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
}, {});
我怎样才能按条件通过组?我找了样本,到现在还没有找到任何解决方案。
预期输出:
[{
"Status": "Active",
"Results": {
"user": {
"urlProfile": "",
"averageRating": 5,
"reviewCount": 2,
"userId": "1244324"
}
}
}
,
{
"Status": "InActive",
"Results": {
"user": {
"urlProfile": "",
"averageRating": 5,
"reviewCount": 2,
"userId": "1244324"
}
}
}]
最佳答案
要获得所需的输出,您需要使用 aggregate
方法,因为它提供了允许您聚合文档并返回上述结果的运算符。
考虑构建一个由 $group
组成的管道 阶段,您可以通过 $avg
汇总平均评分 累加器,reviewCount
和 $sum
和组中的其他字段使用 $first
或 $last
强>。您的按键分组是一个包含两个字段 Status 和 userId 的子文档。
最后的 $project
步骤将允许您将上述组聚合的输出 reshape 为所需的形式和 aggregate()
方法返回一个查询,然后您可以调用该查询 exec()
得到 Promise
.
为了解释上面的框架,按照这个例子:
query: function (model, conditon, options) {
console.log(conditon, options);
options = options || {};
return model.aggregate([
{ "$match": conditon },
{
"$group": {
"_id": {
"Status": "$status",
"userId": "$metadata.user.userId"
},
"urlProfile": { "$first": "$metadata.user.urlProfile" },
"averageRating": { "$avg": "$metadata.user.averageRating" },
"reviewCount": { "$sum": "$metadata.user.reviewCount" }
}
},
{
"$project": {
"_id": 0,
"Status": "$_id.Status",
"Results": {
"user": {
"averageRating": "$averageRating",
"reviewCount": "$reviewCount",
"userId": "$_id.userId"
}
}
}
}
]).exec();
}
关于javascript - 如何在 Mongoose 中使用分组依据和查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43457380/