javascript - 如何在 Mongoose 中使用分组依据和查找?

标签 javascript node.js mongodb mongoose

我有一个名为“listing”的集合,其中包含 metadatastatus 等字段。 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
                }, {});

我怎样才能按条件通过组?我找了样本,到现在还没有找到任何解决方案。

样本收集 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"
    }
  }
}]

最佳答案

要获得所需的输出,您需要使用 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/

相关文章:

node.js - 使用 AWS SDK 加载凭证 JSON 结果出错

javascript - 如何使用nodejs请求库从客户端检测服务器关闭的连接

node.js - React 前端 MLab 访问的安全性

python - 如何模拟 MongoClient 进行 python 单元测试?

javascript - 是否可以检测脚本标签的内容何时被加载并被浏览器传递

javascript - 是否可以使用 d8 来测量内存使用情况?

node.js - 无法识别环境变量的 TypeScript 声明

mongodb - 指定要在 VoyageMongo 中返回的字段

javascript - 在其他文本输入字段中输入文本时启用复选框

javascript - 使用 Promise 链接 http 请求