【问题标题】:Aggregate function two match with lookup mongodb聚合函数两个匹配查找 mongodb
【发布时间】:2020-09-20 04:07:54
【问题描述】:
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
  }
]

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 2022-06-16
      • 2020-12-10
      • 2023-02-25
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多