2017-11-14 8 views
0

applicationコレクションはstatusフィールドと埋め込みofferフィールドにはstatusフィールドも含まれます。 applicationにはofferが付いていない可能性があります。MongoDB - 埋め込みドキュメント付きのカスタムソート集約

私がソートする必要がある条件は少し複雑です。

第一:

注文がなければならないノーオファーしたアプリケーションおよびこれらを除くステータスのいずれかの値:rejectedassignedaccepted

オファーおよびオファーのステータスを持つアプリケーション pending

第二であります

3番目:オファーのアプリケーションはオファーステータス:rejected

第4回:オファーとオファーのアプリケーションATUは次のとおりです。withdrawn

第5回:他の例


私がしようとしていますクエリはこれです:

db.application.aggregate([ 
{ 
    "$project": { 
     "_id": 1, 
     "status": 1, 
     "job": 1, 
     "offer": 1, 
     "user": 1, 
     "denormalized": 1, 
     "custom_sort": { 
      $cond: { 
       if: { $eq: ["offer.$status", "pending"] }, then: 1, 
       else: { 
        $cond: { 
         if: { $ne: ["$status", ["rejected", "assigned", "accepted"]] }, then: 2, 
         else: { 
          $cond: { 
           if: { $eq: ["offer$status", "rejected"] }, then: 3, 
           else: { 
            $cond: { 
             if: { $eq: ["offer$status", "withdrawn"] }, then: 4, 
             else: 5 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     }, 
{"$sort": {"custom_sort": 1}}, 
{ "$project": { "_id": 1, "status": 1, "job": 1, "offer": 1, "user": 1, "denormalized": 1, "custom_sort": 1 } } 
]) 

クエリが動作します。しかし、期待通りではありません。 私が持っている二つの問題があります。

1-アプリケーションが提供されていない場合、最初の条件はどのように私は条件

いくつかのサンプルアプリケーション場合にandまたはorを使用することができます

2-無視されます。ドキュメント:

{ 
    "_id" : ObjectId("59f0c8c517587d306033f9f2"), 
    "status" : "new", 
    "offer" : { 
     "status" : "withdrawn" 
    } 
}, 

{ 
    "_id" : ObjectId("59f0b38517587d29bb1eb6b3"), 
    "status" : "new", 
    "offer" : { 
     "status" : "rejected" 
    } 
}, 

{ 
    "_id" : ObjectId("59f0b35717587d29bb1eb6b2"), 
    "status" : "new", 
    "offer" : { 
     "status" : "pending" 
    } 
}, 

{ 
    "_id" : ObjectId("58de110e46fc387b39744285"), 
    "status" : "rejected" 
}, 

{ 
    "_id" : ObjectId("58de119946fc3876035f823c"), 
    "status" : "new" 
} 
+1

は実際にあなたが期待する文書の順番を「あなたが考慮しなければならない状況」となっていますか? –

+0

@AlexBlex。はい。 – Mojtaba

答えて

1

条件ならばあなたが使用することができますが、あなたはこのparticulrケースでそれらを必要としない$and and $or operatorsがあります。

あなたは$switch場合と良いでしょう。

"custom_sort": { $cond: { 
     if: { $eq: [ { $type: "$offer" }, "object" ] }, 
     then: { $switch: { 
      branches: [ 
       { case: { $eq: [ "$offer.status", "pending" ] }, then: 1 }, 
       { case: { $eq: [ "$offer.status", "rejected" ] }, then: 3 }, 
       { case: { $eq: [ "$offer.status", "withdrawn" ] }, then: 4 }, 
      ], 
      default: 5 
     } }, 
     else: { $cond : { 
      if: { $in: [ "$status", [ "rejected", "assigned", "accepted" ] ] }, 
      then: 2, 
      else: 5 
     } } 
    } } 
+0

ありがとうございました。私は '$と'と '$ or'について知っています。しかし、アグリゲーションはそれらを直接使用することはできません。私はほとんどそれをしたいくつかの変更を加えました。しかし、私はあなたが '$ type'を使ってそれを修正した部分をまだ失っていました。あなたは私を救いました ;) – Mojtaba

関連する問題