2016-12-28 118 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个州,我想在一个查询中获得所有信息。任何其他想法? @伯特兰 - 马特尔 –

相关问题