mongodb聚合匹配属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb聚合匹配属性相关的知识,希望对你有一定的参考价值。

我有一个user_status集合,它的架构是这样的

const userStatus = mongoose.model(
  'user_status',
  new mongoose.Schema(
    {
      user: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'user'
      },
      isActive: {
        type: Boolean,
        default: false
      }
    },
    { timestamps: true }
  )
);

我需要让特定月份的所有活跃用户数(1,2等等)。

我试过这个。但是这个片段没有给出预期的输出

// get all active user count for a specific month
router.post('/report', async (req, res) => {
  const selectedMonth = req.body.month;

  console.log('month', selectedMonth);

  const usersStatus = await UserStatus.aggregate([
    { $project: { month: { $month: '$updatedAt' } } },
    {
      $match: { $and: [{ month: { $eq: selectedMonth } }, { isActive: true }] }
    },
    { $group: { _id: '$user', count: { $sum: 1 } } }
  ]).exec();
  res.status(200).send(usersStatus);
});

你能告诉我我哪里错了吗?

答案

你在第一个isActive阶段后消失了user$project

您可以使用以下聚合

const usersStatus = await UserStatus.aggregate([
  { "$addFields": { "month": { "$month": "$updatedAt" } } },
  { "$match": { "month": selectedMonth, "isActive": true }},
  { "$group": { "_id": "$user", "count": { "$sum": 1 } } }
])

或者使用$expr更方便的方式

const usersStatus = await UserStatus.aggregate([
  { "$match": {
    "$expr": {
      "$and": [
        { "$eq": [{ "$month": "$updatedAt" }, selectedMonth] },
        { "$eq": ["$isActive", true] }
      ]
    }
  }},
  { "$group": { "_id": "$user", "count": { "$sum": 1 } } }
])

以上是关于mongodb聚合匹配属性的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合数组大小大于匹配[重复]

Mongodb聚合数组大小大于匹配[重复]

MongoDB 聚合与特定字段不匹配

MongoDB 聚合框架匹配或

Mongodb匹配聚合不适用于日期

性能聚合 MongoDB 匹配和示例