2017-01-13 8 views
1

MongoDBで集計を使用していますが、問題が発生しました。条件に一致するかどうかに基づいてフィールドを投影したいと思います。例えば異なる条件に基づいて異なるフィールドをプロジェクトする

私はフィールドcoupon_typeその値が1に等しくない場合、その値が1に等しい場合、私は確認対象となる、私はその後、私はフィールド["curr_ctr", "total_coupons", "curr_ctr", "coupons"].

私ができるが投影されますそれ以外のフィールド["curr_ctr", "total_coupons"]を投影しますを持っています2つのクエリを使用して並列に実行しますが、1つのクエリを使用して結果を達成しようとしています。

誰でも私にこの単一のクエリでこれを行うことはできますか教えてください。

UPDATE

マイドキュメント

[{ "_id" : ObjectId("5878e1edf1df5a2b69bcf60e"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1eff1df5a2b69bcf60f"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 0 } , 
{ "_id" : ObjectId("5878e1f1f1df5a2b69bcf610"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1f3f1df5a2b69bcf611"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1f5f1df5a2b69bcf612"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 11 } , 
{ "_id" : ObjectId("5878e1f7f1df5a2b69bcf613"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 110 }, 
{ "_id" : ObjectId("5878e1f9f1df5a2b69bcf614"), "curr_ctr": 12, "total_coupons":35, "coupons": ["hello", "hello2"], "coupon_type" : 0 } ] 

以下のように今、0に等しいすべてのcoupon_typeのために私はフィールド["curr_ctr", "total_coupons", "curr_ctr", "coupons"]を投影すると、0と等しくないすべてのcoupon_typeのために私はフィールド["curr_ctr", "total_coupons"]を投写したいです

更新

実際には、インデックス番号nからn + 1に配列couponsを投影します.nはユーザーの入力です。

+0

はいあなたは** [$指揮]を使用してこれを行うことができます(https://docs.mongodb.com/manual/reference/operator/aggregation/cond/ )** – Yogesh

+0

私は$ condについて知っていますが、どのように$ condを使って異種のフィールドを投影できますか?私にこれを行うためのコードを表示できますか? –

+1

サンプル文書と予想される出力、および試した内容を投稿するより良い方法はありますか? – Yogesh

答えて

1

次の書類

[{ "_id" : ObjectId("5878e1edf1df5a2b69bcf60e"), "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1eff1df5a2b69bcf60f"), "coupon_type" : 0 } , 
{ "_id" : ObjectId("5878e1f1f1df5a2b69bcf610"), "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1f3f1df5a2b69bcf611"), "coupon_type" : 1 } , 
{ "_id" : ObjectId("5878e1f5f1df5a2b69bcf612"), "coupon_type" : 11 } , 
{ "_id" : ObjectId("5878e1f7f1df5a2b69bcf613"), "coupon_type" : 110 }, 
{ "_id" : ObjectId("5878e1f9f1df5a2b69bcf614"), "coupon_type" : 0 } ] 

今、あなたのようにproject$eqを使用する必要が含まれているあなたのコレクションを見てみましょう:

:あなたはこのようなとしてクエリを変更する必要があり、新たなアップデートを1として

db.collectoin.aggregate({ 
    "$project": { 
    "result": { 
     "$cond": { 
    "if": { 
     "$eq": ["$coupon_type", 1] 
    }, 
    "then": ["curr_ctr", "total_coupons"], 
    "else": ["curr_ctr", "total_coupons", "curr_ctr", "coupons"] 
     } 
    } 
    } 
}) 

db.collection.aggregate({ 
    "$project": { 
    "result": { 
     "$cond": { 
    "if": { 
     "$eq": ["$coupon_type", 1] 
    }, 
    "then": ["$curr_ctr", "$total_coupons", "$coupons"], 
    "else": ["$curr_ctr", "$total_coupons"] 
     } 
    } 
    } 
}) 

更新

新しい更新ごとに、あなたのnをexのユーザーに与えてください。 :var n = 1;

今クエリとして以下のようになります。

db.coupon.aggregate({ 
    "$project": { 
    "result": { 
     "$cond": { 
    "if": { 
     "$eq": ["$coupon_type", 1] 
    }, 
    "then": ["$curr_ctr", "$total_coupons", { 
     "coupons": { 
     "$slice": ["$coupons", n, n + 1] 
     } 
    }], 
    "else": ["$curr_ctr", "$total_coupons"] 
     } 
    } 
    } 
}) 
+0

2つのことがわからない1)コードがフィールド値の配列または文字列の配列を返すかどうか。 2)OPが値の配列を取得したいかどうか。配列の長さをチェックし、インデックスで値を取得する。私は彼がフィールドとしてドキュメントのフィールドを取得したいと賭ける –

+0

@SergeyBerezovskiy私はOPが値の配列を必要としていることをかなり確信しています、私は既にサンプルドキュメントと期待される出力を表示するコメントに頼んだがOPは正しく説明しませんでした。だから、私はOPが集計で状態を書く方法だけが必要だと思ったので、私はそれを非常に簡単な方法で投稿しました。OPがどのように質問を更新するのかを見てみましょう。 – Yogesh

+0

申し訳ありませんが、私は自分の配列に存在するフィールドを投影したいので機能しません。私の編集した質問を見てください。とにかくありがとう。 –

関連する問題