如何在MongoDB中对数据进行分组

时间:2015-07-20 15:01:16

标签: mongodb jasper-reports mongodb-query aggregation-framework

我有一个基于对象的MongoDB查询为"Ticket"结构,每个票据通常包含任务对象,每个票都有一个所有者,如果票证是打开的,则关联Owner是{{1另一方面,如果票证已关闭,则关联所有者为“OpnPrps.CurAgtNme”

这就是我的数据库(JSON)的样子:

“Nms.CloAgt”

我用来对数据进行分组的查询如下:

{
    "result" : [ 
        {
            "_id" : NumberLong(3131032306336),
            "TicId" : 1147552,
            "OrgId" : 729,
            "Sts" : "Closed",
            "CrtDat" : ISODate("2015-04-23T18:50:46.000Z"),
            "CloDat" : ISODate("2015-04-23T19:46:26.000Z"),
            "ShtDes" : "Copy of Employment agreement",
            "Des" : "EE wants a copy of employment agreement. address was verified.",
            "DesSum" : "EE wants a copy of employment agreement. address was verified.",
            "Sol" : "ISIGHT TICKET NUMBER:<br><h1>US-04-15-01109</h1>",
            "CrtAgtId" : 20444,
            "CloAgtId" : 20149,
            "CrtApp" : null,
            "IsInt" : false,
            "HasPrtTsk" : null,
            "PexBodId" : "",
            "PayGrp" : "",
            "RvwDat" : null,
            "RclDat" : null,
            "IsDynDueDatDef" : false,
            "OlaDat" : ISODate("2015-04-25T00:50:50.000Z"),
            "SlaDat" : ISODate("2015-04-25T00:50:50.000Z"),
            "DynDueDatElaDat" : null,
            "ReaTim" : "00:00:00",
            "LstUpd" : ISODate("2015-04-23T19:46:26.000Z"),
            "VrsOnl" : 2,
            "VrsArc" : 1,
            "OpnPrps" : null,
"Nms" : {
                "Cmp" : "Organization1 US",
                "Org" : "Organization1",
                "Srv" : "Policies",
                "SrvGrp" : "17. Workforce Administration (NGR)",
                "Wkg" : "WORKGROUP1",
                "Pri" : "",
                "Tir" : "T1",
                "Src" : "Call",
                "CrtAgt" : "Arun ",
                "CloAgt" : "Felicia"
            },
"Olas" : {
                "_id" : 2,
                "EntNam" : "ENTITY",
                "DueDat" : ISODate("2015-04-25T00:50:50.000Z"),
                "AmbDat" : ISODate("2015-04-24T20:50:49.000Z"),
                "DueDatElaDat" : null,
                "AmbDatElaDat" : null,
                "SlaDuration" : 18,
                "TotTim" : NumberLong(0),
                "TotTimPndEnt" : NumberLong(0),
                "TotTimPndEmp" : NumberLong(0),
                "RclInSla" : false
            },
"Tsks" : {
                "_id" : 1,
                "Typ" : "Planned",
                "CrtDat" : ISODate("2015-04-23T18:50:46.000Z"),
                "CloDat" : null,
                "LstUpd" : ISODate("2015-04-23T18:50:46.000Z"),
                "DueDat" : ISODate("2015-04-25T00:50:50.000Z"),
                "TimCplTsk" : 1080,
                "DueDatEla" : false,
                "AgtOwnId" : null,
                "WkgSklId" : 45387,
                "EntId" : 2,
                "Sts" : "Open",
                "PrdTskId" : 201,
                "Ttl" : "Provide Navigational Assistance",
                "Des" : "Provide Navigational Assistance",
                "SrvSklId" : 45792,
                "PriSklId" : null,
                "TotTim" : 0,
                "PtnId" : null,
                "PtnTic" : null,
                "DepTskId" : null,
                "IsAct" : true,
                "IsMndOnCloTic" : false,
                "Nms" : {
                    "AgtOwn" : null,
                    "Wkg" : "CM_T1",
                    "Ent" : "ENTITY",
                    "SrvSkl" : "Policies",
                    "PriSkl" : null,
                    "Ptn" : null,
                    "Frm" : ""
                },
                "AscTicItm" : null,
                "FrmId" : null,
                "Flds" : []
            },

通过这个查询,我能够获得每个所有者的每张票(即使他们是打开或关闭的)以及他们的关联任务,我的问题是我想要在不考虑状态的情况下对所有票组进行分组,在我现在的结果之后,就像第二组一样,见下文:

我使用此查询获得的Jasper Studio表格如下:

db.tickets.aggregate([
    {$match:{
        'Nms.Org': 'Organization1',
        'Nms.Cmp':'Company',
        'Nms.Wkg':'Workgroup’

    }},
    {$project:{
        _id:0,
        'Tsks._id':1,
        'Tsks.Sts':1,
        'Tsks.DueDat':1,
        'Sts':1,
        'Nms.Org':1,
        'Nms.Cmp':1,
        'Nms.Wkg':1,
        'Nms.CloAgt':1,
        'OpnPrps.CurAgtNme':1, 
        'OpnPrps.CurEntNme':1,
        'Olas.EntNam':1
        }},

    {$unwind : "$Olas" },
    {$unwind : "$Tsks" },
    {$match:{$and:[{
        'Tsks.DueDat': {$ne: null},
        'Olas.EntNam': 'Entity',
        'Tsks._id':{$gt:0}
        }]}},

        {$group:
    {_id:{
                Org:'$Nms.Org',
                Cmp:'$Nms.Cmp',
                Wkg:'$Nms.Wkg',
                CurEntNme:'$Olas.EntNam', 
                CurTskId: '$Tsks._id',
                DueDate:'$Tsks.DueDat', 
                Owner1:'$OpnPrps.CurAgtNme', 
                Owner2:'$Nms.CloAgt'
                },
                All: {$sum: { $cond: 
                             [ 
                                {   $eq: [ '$Tsks.DueDat' , null ] } ,0,1
                             ]}}

            },

        }
    ])

正如您所看到的,由于每个故障单的字段不同,我会得到重复的值。我正在寻找的表应该是这样的:

Owner       Inventory   
---------   --------------
Noemi          1                   Owner1:Noemi | Owner2:null
Carl           2                   Owner1:null | Owner2:Carl
Darla          2                   Owner1:Darla| Owner2:null
Carl           1                   Owner1:Carl| Owner2:null
Paola          2                   Owner1:null| Owner2:Paola
Noemi          2                   Owner1:null | Owner2:Noemi

所以,我的问题是我找不到再次对这些结果进行分组以获得第二个表的方法。

0 个答案:

没有答案