计数字段包含具有聚合mongodb的集合中的数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数字段包含具有聚合mongodb的集合中的数据相关的知识,希望对你有一定的参考价值。

这是我的样本数据库集合:

{ 
    "_id" : ObjectId("5a9797b480591678e0771190"), 
    "staff_id" : NumberInt(172), 
    "temp_name" : "Regular Employment", 
    "individual_setting" : false, 
    "employment_category" : "Regular Employee", 
    "branch_office" : "Cebu Branch Office", 
    "availability_status" : "Incumbent", 
    "req_working_hours" : "08:00", 
    "fixed_brk_time_from" : "12:00", 
    "fixed_brk_time_to" : "13:00", 
    "sch_time_setting" : [
        {
            "holiday" : [
                "Saturday", 
                "Friday"
            ], 
            "biweekly_odd" : [

            ], 
            "biweekly_even" : [
                "Saturday"
            ], 
            "clock_in_mon" : "08:40", 
            "clock_in_tue" : "08:40", 
            "clock_in_wed" : "08:40", 
            "clock_in_thu" : "08:40", 
            "clock_in_fri" : "08:40", 
            "clock_in_sat" : "08:40", 
            "clock_in_sun" : null, 
            "clock_in_hol" : null, 
            "clock_out_mon" : "18:00", 
            "clock_out_tue" : "18:00", 
            "clock_out_wed" : "18:00", 
            "clock_out_thu" : "18:00", 
            "clock_out_fri" : "18:00", 
            "clock_out_sat" : "18:00", 
            "clock_out_sun" : null, 
            "clock_out_hol" : null, 
            "_id" : ObjectId("5a9797b480591678e077118f")
        }
    ], 
    "date_to_start" : ISODate("2018-03-01T06:03:32.050+0000"), 
    "createdAt" : ISODate("2018-03-01T06:03:32.066+0000"), 
    "updatedAt" : ISODate("2018-03-01T06:03:32.066+0000"), 
    "__v" : NumberInt(0)
}

clock_in_mon字段下的字段clock_in_holsch_time_setting之间,我想要计算有多少字段有数据或不为空。由于每个员工都有不同的time_setting,因此这些字段可能在其他员工中的数据很少。

对此的预期计数是:6,因为只有clock_in_monclock_in_sat才有数据。

我从这里尝试了Count fields in a MongoDB Collection的代码,但我不能在我的情况下做到。

答案

尝试以下聚合:

    db.yourCollectionName.aggregate([
    {
        $project: {
            totalClockIns: {
              $map: {
                   input: "$sch_time_setting",
                   as: "setting",
                   in: {
                      _id: "$$setting._id",
                      kvPairs: {
                        $objectToArray: "$$setting"
                      }
                   }
                }
            }
        }
    },
    {
        $project: {
            totalClockIns: {
                $map: {
                   input: "$totalClockIns",
                   as: "clockIn",
                   in: {
                      _id: "$$clockIn._id",
                      count: { 
                        $size: { $filter: { input: "$$clockIn.kvPairs", as: "pair", cond: { $and: [
                        {$eq: [{ $indexOfBytes: [ "$$pair.k", "clock_in_" ] },0]},{$ne: ["$$pair.v",null]}] } } } }
                    }
                }
            }
        }
    }
])

要分析文档,您需要比较键名称。要做到这一点,你必须使用$objectToArray运算符,它将变换和对象转换为键值对列表。然后你可以找到那些key名称以clock_开头的对(使用$indexOfBytes),其中值不等于null。使用$filter你可以摆脱所有其他对,你需要做的就是使用$size来获得数组的长度。

这将给你以下结果:

{ "_id" : ObjectId("5a9797b480591678e0771190"), "totalClockIns" : [ { "_id" : ObjectId("5a9797b480591678e077118f"), "count" : 12 } ] }

以上是关于计数字段包含具有聚合mongodb的集合中的数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoDB 中的聚合删除集合中所有文档的特定字段

向MongoDB中的现有集合添加具有大量行的新字段

MongoDB 聚合错误:管道阶段规范对象必须只包含一个字段

MongoDB在具有附加字段的对象数组上聚合$lookup

MongoDB在具有附加字段的对象数组上聚合$lookup

将 Mongodb 中的日期与 C# LINQ 驱动程序进行比较