NodeJS 基于唯一字段值获取文档计数

7z5jn7bk  于 2024-01-07  发布在  Node.js
关注(0)|答案(2)|浏览(110)

我有一个 Mongoose 工作模型,每个工作都有一个美国州。我试图做一个查询,这将给予我在每个州的工作数量。目标将是填充美国就业热图。
我的模型看起来像这样:

  1. const JobSchema = new Schema({
  2. state: {
  3. type: String,
  4. required: true
  5. },
  6. status: {
  7. type: String,
  8. enum: ['Available', 'Accepted', 'Closed'],
  9. default: 'Available'
  10. }
  11. }, { versionKey: false, timestamps: true });

字符串
我所寻找的结果将给我给予接近于:

  1. {
  2. docs: [
  3. {
  4. state: 'FL',
  5. count: 27
  6. },
  7. {
  8. state: 'NC',
  9. count: 41
  10. }
  11. ]
  12. }


我已经修补了迭代if $distinct和其他,但没有运气。任何帮助将不胜感激。

30byixjq

30byixjq1#

你需要创建一个如下的聚合:

  1. [
  2. {
  3. $group: {
  4. _id: "$state",
  5. count: {
  6. $sum: 1
  7. }
  8. }
  9. }
  10. ]

字符串
此聚合按状态对数据进行分组,计数使用**$sum**运算符,并为每个文档添加一个。

w3nuxt5m

w3nuxt5m2#

Armin上面的回答为解决这个问题提供了正确的途径。感谢Mongo Atlas在他们的界面中包含了聚合,这帮助我理解了聚合中的stages
对于我上面的问题,还有一个额外的复杂性值得在这里为下一个学习聚合的人注意。我正在构建的系统是多租户的,因此作业属于一个组织-并且有许多组织,每个组织都有许多作业。我希望我的查询能够获取属于单个组织的作业的计数。
我的聚合查询结果是:

  1. const aggConfig = [
  2. {
  3. $match: {
  4. organizationId: new mongoose.Types.ObjectId(orgId)
  5. }
  6. },
  7. {
  8. $group: {
  9. '_id': '$state',
  10. 'count': {
  11. '$sum': 1
  12. }
  13. }
  14. }
  15. ];

字符串
请注意,agg查询是一个数组。数组中的每个项目都是stage,在流程顺序中,stage是step-在这种情况下很重要。第1步(aggConfig[0])将结果集隔离为仅属于特定组织的作业。第2步(aggConfig[1])按状态执行作业求和,返回所需的数据数组。
使用Mongoose模型执行:

  1. const agggregatedByState = await JobModel.aggregate(aggConfig);

展开查看全部

相关问题