2015-04-14 91 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的結果。我收到的結果不如預期,但這是我需要調查的另一件事。再次感謝您的時間:) –