2016-12-28 19 views
0

私は、状態の変更や存在するメンバーが存在する場合には、どのメンバーが存在しないのかを知りたい。以下のようなMongoDBで2番目の文書と1番目の文書をどのように並べ替えるのか?

状態の順序のための私の与えられた配列は:

[{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") 
     } 
    ] 
    } 

私は、どのメンバーが1つの州から別の州に存在していないか、どのメンバーが存在しているのかを知りたいと思います。現在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人のメンバー - (IP CS)第二状態手段への私の試験の第一の状態では

そして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"]ため、このような状態の「カップル」あたりの集約要求:2つの要素(ここでは["IP", "AC"])を一致させるために、我々はgroup1 & group2$setIntersection$setDifferenceに2つの新しいフィールドを作成する必要があるため、これはのみ動作すること

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"] } 
      ] 
     } 
    } 
}]) 

注意

$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州を持っており、すべての情報を1つのクエリで取得したいと考えています。他のアイデア? @ bertrand-martel –

関連する問題