聚合函数二与查找mongodb匹配

时间:2020-06-01 19:11:03

标签: mongodb aggregation-framework

db.setting.aggregate([
  {
    $match: {
      status: true,
      deleted_at: 0,
      _id: {
        $in: [
          ObjectId("5c4ee7eea4affa32face874b"),
          ObjectId("5ebf891245aa27c290672325")
        ]
      }
    }
  },
  {
    $lookup: {
      from: "site",
      localField: "_id",
      foreignField: "admin_id",
      as: "data"
    }
  },
  {
    $project: {
      name: 1,
      status: 1,
      numberOfRecord: {
        $size: "$data"
      }
    }
  },
  {
    $sort: {
      numberOfRecord: 1
    }
  }
])

我想获取大于2020-01-01的记录和记录数,试图添加以下代码,但未成功。

我该如何正确设置,请提前进行感谢。这是游乐场https://mongoplayground.net/p/GU8WbTVqo2I

{
    $match: {
      "data.createdAt": {
        $gte: new Date("2020-01-01")
      }
    }
  },

输出应为

[
  {
    "_id": ObjectId("5ebf891245aa27c290672325"),
    "name": "Menz",
    "numberOfRecord": 0,
    "status": true
  },
  {
    "_id": ObjectId("5c4ee7eea4affa32face874b"),
    "name": "Dave",
    "numberOfRecord": 1, // instead 2 bcoz this is only gte "2020-01-01"
    "status": true
  }
]

1 个答案:

答案 0 :(得分:1)

您可以使用$unwind拆分数组,但是使用$match将完全消除没有任何匹配文档的文档,因此您需要将$group与条件计数,也许:

db.setting.aggregate([
  {$match: {
      status: true,
      deleted_at: 0,
      _id: {
        $in: [
          ObjectId("5c4ee7eea4affa32face874b"),
          ObjectId("5ebf891245aa27c290672325")
        ]
      }
  }},
  {$lookup: {
      from: "site",
      localField: "_id",
      foreignField: "admin_id",
      as: "data"
  }},
  {$unwind: {
        path: "$data",
        preserveNullAndEmptyArrays: true
  }},
  {$group: {
      _id: "$_id",
      name: {$first: "$name"},
      status: {$first: "$status"},
      numberOfRecord: {
        $sum:{
           $cond:{
              if:{
                  $gte:[
                        "$data.createdAt",
                        new Date("2020-01-01")
                       ]
              },
              then: 1,
              else: 0
           }
        }
     }
  }},
  {$sort: { numberOfRecord: 1 }}       
])

Playground