2016-12-28 76 views
0

我想知道哪些成員在狀態變化時以及哪個成員在場時不存在。如何根據給定的順序計算MongoDB中的第一個文檔和第二個文檔?

我定的數組爲國家秩序,如:

[{order:1,text:'CS'}, {order:2,text:'IP'}, {order:3,text:'AC'}] 

所以我想按照這個數組排序要與文檔每消減執行一些操作

我的文件,如:

{ 
    "count" : 2, 
    "state" : "CS", 
    "members" : [ 
    { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-24T03:39:05.720Z") 
    }, 
    { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-25T02:32:48.698Z") 
    } 
    ] 
}, 
{ 
    "count" : 1, 
    "state" : "AC", 
    "members" : [ 
    { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-24T03:39:05.720Z") 
    } 
    ] 
}, 
    { 
    "count" : 3, 
    "state" : "IP", 
    "members" : [ 
     { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-24T03:39:05.720Z") 
     }, 
     { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-25T02:32:48.698Z") 
     }, 
     { 
     "email" : "[email protected]", 
     "date" : ISODate("2016-12-25T02:32:48.698Z") 
     } 
    ] 
    } 

所以我想知道哪些成員不存在從一個國家到另一個國家以及哪些成員在場。

以我考試第一狀態到第二狀態的裝置(CS - IP):本2個部件和不存在1個構件

{ 
"state": "CS_IP", 
"present": [ 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-24T03:39:05.720Z") 
    }, 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-25T02:32:48.698Z") 
    } 
], 

"notPresent": [ 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-25T02:32:48.698Z") 
    } 
] 
} 

和第二狀態到第三狀態的裝置(IP - AC):本1個構件並且不存在2成員

{"state": "IP_AC", 
"present": [ 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-24T03:39:05.720Z") 
    } 
], 

"notPresent": [ 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-25T02:32:48.698Z") 
    }, 
    { 
    "email" : "[email protected]", 
    "date" : ISODate("2016-12-25T02:32:48.698Z") 
    } 
]} 

我怎樣才能做到這一點使用aggregate查詢,因爲我需要這個階段完成後,一些聚合操作

回答

0

您可以執行一個每個這樣的狀態的「情侶」聚合請求爲["IP", "AC"]

db.exams.aggregate([{ 
    $match: { 
     "state": { 
      $in: ["IP", "AC"] 
     } 
    } 
}, { 
    "$group": { 
     "_id": 1, 
     "group1": { "$first": "$members" }, 
     "group2": { "$last": "$members" } 
    } 
}, { 
    "$project": { 
     "present": { "$setIntersection": ["$group1", "$group2"] }, 
     "notPresent": { 
      $setUnion: [ 
       { "$setDifference": ["$group1", "$group2"] }, 
       { "$setDifference": ["$group2", "$group1"] } 
      ] 
     } 
    } 
}]) 

注意,這隻會工作的2個元素匹配(在這裏["IP", "AC"]),因爲我們要創建兩個新的領域group1 & group2$setIntersection$setDifference (因爲不存在與$setIntersection$setDifference沒有$group

上述查詢會給:

{ 
    "_id": 1, 
    "present": [ 
     { "email": "[email protected]", "date": ISODate("2016-12-24T03:39:05.720Z") } 
    ], 
    "notPresent": [ 
     { "email": "[email protected]", "date": ISODate("2016-12-25T02:32:48.698Z") }, 
     { "email": "[email protected]", "date": ISODate("2016-12-25T02:32:48.698Z") } 
    ] 
} 
+0

感謝您的回覆。我有大約20個州,我想在一個查詢中獲得所有信息。任何其他想法? @伯特蘭 - 馬特爾 –

相關問題