2015-04-14 90 views
1

我希望有人可以帮助我的话题... 我有一个基于“Tickets,Tasks and Comentaries(Coms)”结构的mongoDB查询,Tickets数组通常包含Tasks数组和Coms数组,所以我需要展开它们。我的代码是:比较MongoDB中不同数组的两个字段

db.tickets.aggregate([ 
    {$unwind : "$Coms" }, 
    {$match:{ 
     'Tsks.Sts': 'Closed', //Status: tasks which are closed 
     'Coms.TicTskId': {$eq: '$Tsks._id'},** 
     'Coms.Typ':'CloseTask' 

     }}, 

    {$project:{ 
     _id:0, 
     'Tsks._id':1, 
     'Tsks.Sts':1, 
     'Tsks.DueDat':1, 
     'Nms.Org':1, 
     'Nms.Cmp':1, 
     'Nms.Wkg':1,  
     'Coms.Typ':1, 
     'Coms.Msg': 1, 
     'Coms.TicTskId':1 
     }}, 

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

    {$group: 
     {_id:{Org:'$Nms.Org',Cmp:'$Nms.Cmp',Wkg:'$Nms.Wkg', DueDate:'$Tsks.DueDat', CurTskId: '$Tsks._id',Type:'$Coms.Typ',Msg: '$Coms.Msg', TicTskId: '$Coms.TicTskId'}, 
     Total_Closed:{$sum:1}, 
     }}, 

    {$project:{ 
     Total_Closed : 1, 
     Comparation: {$cmp: [ '$CurTskId', '$TicTskId']}, 
     Equal: {$eq: [ "$CurTskId", "$TicTskId"]}, 
     }}, 
     { 
      $sort : {CurEntNme:-1,Org: 1,Cmp : 1 ,Wkg: 1 } 
      } 

    ]) 

我试图显示一组需要遵循这些特征的任务:

"Sts":"Closed", --> Status should be Closed 
    'Tsks.DueDat': {$ne: null}, --> Tasks DueDate shouldn't be null 
    'Coms.Typ':'CloseTask', --> Coments type should be "CloseTask" 
    'Coms.TicTskId' == '$Tsks._id' --> Comments ID should be as same as Tasks ID 

我在这里的主要问题是,我无法找到获得方式只有具有所有这些分组条件的值,我的意思是,除了最后一个ID,当两个ID都相等时,我看不到所有条件。我只希望看到所有的iqual,但是这个查询返回两个,如果它们相等或不相等则独立。例如,一个结果我得到:

result: 
    [item] 
    _id: 
     Org--> Organization 
     Company --> Organization 1 
     Wkg --> WKG 1 
     DueDate --> 2015-04-10 15:00:00.000Z 
     CurTskId --> 7 
     Type --> CloseTask 
     Msg --> these is close 
     TicTskId --> 1 
    Total_Closed --> 1 
    Comparation --> 0 
    Equal --> true 

比较 - 不应该是0,因为CurTskId和TicTskId不 类似

相等的,因为CurTskId和TicTskId不相似不应该是真实的

一层数据库结构如下:

>(1) 12000000  {7 fields}   Object 
    _id    12000000    Int64 
    TicId   1001     Int32 
    OrgId   2     Int32 
    Sts    Closed    String 
    >Nms    {3 fields}   Object 
    Cmp    Organization 1  String 
    Org    Organization   String 
    Wkg    Workgroup   String 
    >Tsks    {3 fields}   Object 
    _id    1     Int32 
    Sts    Closed    String 
    DueDat   2015-04-10   Date 
    >Coms    {3 fields}   Object 
    TicTskId   7     Int32 
    Typ    CloseTask   String 
    Msg    these is close  String 

我希望我能以最好的方式解释我的问题,如果我的英语不太好,很抱歉。

在此先感谢。

+3

欢迎来到StackOverflow!您能否请您尝试在您的问题中包含实际代码而不是图像,因为图像中的代码无法复制并粘贴到编辑器中并进行编译以重现问题。在为什么通常不推荐在SO上发布代码图像的许多其他原因中,图像很大并且难以在移动设备上阅读,它们不能被搜索,因此对于未来的读者是没有用的。你要求我们自由地解决你的问题,我们应该尽可能地容易地做到这一点。 – chridam

+0

嗨chridam,抱歉的图像,我编辑我的帖子试图解释我的问题尽我所能没有上传任何图像在第三个网站。我有一个我不能分享的具体法人数据库,所以我希望有人能够理解我的问题,自从几个星期前我一直在调查这个问题。感谢您的评论和亲切的问候。 –

+0

感谢您付出努力更新问题。我知道你有一个你不能共享的特定公司数据库,但是你能否用一些样本测试文件集合来更新你的问题,这些文件包含测试数据和我们可能复制的预期聚合结果,测试并提供解决方案或建议?事实上,如果没有一些测试数据可以付诸实施,这是有点困难的。 – chridam

回答

0

根据你在你的问题有数据,假设您有以下文件的架构和数据:

/* 0 */ 
{ 
    "_id" : 12000000, 
    "TicId" : 1001, 
    "OrgId" : 2, 
    "Sts" : "Closed", 
    "Nms" : [ 
     { 
      "Cmp" : "Organization 1", 
      "Org" : "Organization", 
      "Wkg" : "Workgroup" 
     } 
    ], 
    "Tsks" : [ 
     { 
      "_id" : 1, 
      "Sts" : "Closed", 
      "DueDat" : ISODate("2015-04-10T00:00:00.000Z") 
     } 
    ], 
    "Coms" : [ 
     { 
      "TicTskId" : 1, 
      "Typ" : "CloseTask", 
      "Msg" : "these is close" 
     } 
    ] 
} 

为了使两个领域在$match管道比较聚集是不可能的,但是解决方法是通过$project操作将数据存储在管道中的附加字段中时设置条件,以便您可以使用isComsTsksEqual字段进行快速真相检查。做这种查询的速度会非常快。正如您在上面的测试文档中看到的,"Tsks._id"等于“Coms.TicTskId”,因此额外的isComsTsksEqual字段变为true,您现在可以在您的$match运算符中使用该字段。下面聚集管道说明了这一点:

db.tickets.aggregate([ 
    { 
     "$project": { 
      "TicId": 1, 
      "OrgId": 1, 
      "Sts": 1, 
      "Nms": 1, 
      "Tsks": 1, 
      "Coms": 1, 
      "TsksComp": "$Tsks._id"    
     } 
    }, 
    { 
     "$project": { 
      "TicId": 1, 
      "OrgId": 1, 
      "Sts": 1, 
      "Nms": 1, 
      "Tsks": 1, 
      "Coms": 1, 
      "isComsTsksEqual": { 
       "$eq" : [ "$Coms.TicTskId", "$TsksComp" ] 
      } 
     } 
    }, 
    { 
     "$unwind": "$Tsks" 
    }, 
    { 
     "$unwind": "$Coms" 
    },  
    { 
     "$match": { 
      "Tsks.Sts": "Closed",    
      "Coms.Typ": "CloseTask", 
      "isComsTsksEqual": true 
     } 
    } 
]); 

这将返回

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : 12000000, 
      "TicId" : 1001, 
      "OrgId" : 2, 
      "Sts" : "Closed", 
      "Nms" : [ 
       { 
        "Cmp" : "Organization 1", 
        "Org" : "Organization", 
        "Wkg" : "Workgroup" 
       } 
      ], 
      "Tsks" : { 
       "_id" : 1, 
       "Sts" : "Closed", 
       "DueDat" : ISODate("2015-04-10T00:00:00.000Z") 
      }, 
      "Coms" : { 
       "TicTskId" : 1, 
       "Typ" : "CloseTask", 
       "Msg" : "these is close" 
      }, 
      "isComsTsksEqual" : true 
     } 
    ], 
    "ok" : 1 
} 

你的职业目标是什么与聚集,但那么你可以通过整合上述修改当前的聚集管道不能肯定:

db.tickets.aggregate([ 
    { 
     "$project": { 
      "TicId": 1, 
      "OrgId": 1, 
      "Sts": 1, 
      "Nms": 1, 
      "Tsks": 1, 
      "Coms": 1, 
      "TsksComp": "$Tsks._id"    
     } 
    }, 
    { 
     "$project": { 
      "TicId": 1, 
      "OrgId": 1, 
      "Sts": 1, 
      "Nms": 1, 
      "Tsks": 1, 
      "Coms": 1, 
      "isComsTsksEqual": { 
       "$eq" : [ "$Coms.TicTskId", "$TsksComp" ] 
      } 
     } 
    }, 
    { 
     "$unwind": "$Tsks" 
    }, 
    { 
     "$unwind": "$Coms" 
    }, 
    { 
     "$unwind": "$Nms" 
    }, 
    { 
     "$match": { 
      "Tsks.Sts": "Closed",    
      "Coms.Typ": "CloseTask", 
      "Tsks._id": { "$gt": 0 }, 
      "Tsks.Sts": "Closed", 
      "Tsks.DueDat": { "$ne": null }, 
      "isComsTsksEqual": true 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "Org": "$Nms.Org", 
       "Cmp": "$Nms.Cmp", 
       "Wkg": "$Nms.Wkg", 
       "DueDate": "$Tsks.DueDat", 
       "CurEntNme": "$OpnPrps.CurEntNme", 
       "CurTskId": "$Tsks._id", 
       "Type": "$Coms.Typ", 
       "Msg": "$Coms.Msg", 
       "TicTskId": "$Coms.TicTskId" 
      }, 
      "Total_Closed": { 
       "$sum": 1 
      } 
     } 
    }/*, 
    { 
     "$project": { 
      "Total_Closed": 1, 
      "Comparison": { 
       "$cmp": [ "$CurTskId", "$TicTskId" ] 
      }, 
      "Equal": { 
       "$eq": [ "$CurTskId", "$TicTskId" ] 
      }, 
     } 
    }*/, 
    { 
     "$sort": { 
      "CurEntNme": -1, 
      "Org": 1, 
      "Cmp": 1, 
      "Wkg": 1 
     } 
    } 
]) 
+1

非常感谢你chridam!最后,“双重项目结构”工作正常,现在我只能得到具有相同任务和Coms ID的结果。我收到的结果不如预期,但这是我需要调查的另一件事。再次感谢您的时间:) –