用填充进行汇总

时间:2019-02-11 18:23:41

标签: mongodb mongoose

我在以下方面遇到了麻烦。我想知道是否可以通过单个查询来做到这一点。

所以我有以下模型:

const Analytics = new Schema({
  createdAt: {
    type: Date,
    default: Moment(new Date()).format('YYYY-MM-DD')
  },
  loginTrack: [
    {
      user_id: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Users',
      }
    }
  ]
}, { collection: 'analytics' });

用户模型:

const UserSchema = new mongoose.Schema(
  {
    nickname: {
      type: String,
      required: true,
      unique: true
    },
    instance: {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Instances',
      default: null
    }}, {collection: 'users'});

我想在特定日期获取特定实例的已连接用户。

AnalyticsModel.aggregate([
  {
    $match: {
      createdAt: { "$gte": moment(args.startDate).format('YYYY-MM-DD'), "$lt": moment(args.endDate).format('YYYY-MM-DD')}
    }
  },
  {
    "$project": {
      users: { $size: "$loginTrack" },
      "createdAt": 1,
      "_id": 0
    }
  }, {
    "$group": {
      "_id": "$createdAt",
      "count": { "$sum": "$users" }
    }
  }

这让我

[ { _id: '2019-02-11', count: 3 },
  { _id: '2019-02-08', count: 6 },
  { _id: '2019-02-07', count: 19 },
  { _id: '2019-02-06', count: 16 } ]

预期结果将是相同的,但我想过滤属于特定实例的用户

是否可以通过单个查询进行操作,还是需要在聚合之前先进行填充?

更新

我在此方面取得了一些进展,我需要添加查找,并且我认为还可以:

   AnalyticsModel.aggregate([
  {"$unwind": "$loginTrack"},
  {
    $lookup:
    {
      from: 'users',
      localField:'loginTrack.user_id',
      foreignField: '_id',
      as: '_users'
    }
  },
  {
    $match: {
      createdAt: { "$gte": new Date(args.startDate), "$lt": new Date(args.endDate)}
    }
  },
  {
    $project: {
      _users: {
        $filter: {
          input: '$_users',
          as: 'item',
          cond: {
            $and: [
              { $eq: ["$$item.instance", new ObjectId(args.instance_id)] }
            ]
          }
        }
      },
      "createdAt": 1,
      "_id": 0

    }
  },
  {
    "$group": {
      "_id": "$createdAt",
      "count": { "$sum": { "$size": "$_users" } }
    }
  }

日期在模型中也是字符串形式。

现在的输出是:

[ { _id: 2019-02-11T00:00:00.000Z, count: 2 } ]

0 个答案:

没有答案