2016-05-09 3 views
1

のMongoDB集約フレームワークで結果を組み合わせますto sequenceID)、その 'q0'は確実に1に等しい(他のqxフィールドは0または1かもしれない)。 私はq1、q2、...、q5について同じことをしたいと思います。言い換えれば、最新の文書を表す6つのレコードを含む結果が必要です。そのうちの「qn」(n = 0..5)レコードは間違いなく「0」です。は、複数の一致を()私は次のクエリを得た

次の部分を6回繰り返して($ matchセクションのqx値が異なる場合)、それらを組み合わせることは可能ですか?

{ 
    $match : 
    { 
     "q0":"1" 
    } 
}, 
{ 
    $sort : { "sequenceID" : -1, } 
}, 
{ 
    $limit : 1 
} 

これはもっと良い解決策ですか?

--- EDIT(いくつかのサンプル[簡体]データの追加):

/* 1 */ 
{ 
    "_id" : ObjectId("57288fa553f65928c4bf4b2b"), 
    "header" : { 
     "MessageType" : "04" 
    }, 
    "content" : { 
     "Changes" : [ 
      "0", 
      "1", 
      "1", 
      "1", 
      "1", 
      "0" 
     ] 
    }, 
    "sequenceID" : NumberLong(369851), 
    "messageDate" : 13950214 
} 

/* 2 */ 
{ 
    "_id" : ObjectId("57288fa453f65928c4bf4863"), 
    "header" : { 
     "MessageType" : "04" 
    }, 
    "content" : { 
     "Changes" : [ 
      "0", 
      "0", 
      "1", 
      "0", 
      "0", 
      "0" 
     ] 
    }, 
    "sequenceID" : NumberLong(369139), 
    "messageDate" : 13950214 
} 

/* 3 */ 
{ 
    "_id" : ObjectId("57288fa353f65928c4bf43c2"), 
    "header" : { 
     "MessageType" : "04" 
    }, 
    "content" : { 
     "Changes" : [ 
      "0", 
      "1", 
      "0", 
      "0", 
      "0", 
      "0" 
     ] 
    }, 
    "sequenceID" : NumberLong(367953), 
    "messageDate" : 13950214 
} 

各文書(6まで)の変更を一つ以上を示します。変更はq0..q5フィールドに表示されます。出力として必要なのは、各qxフィールドの最新の変更です。文書の順序は「sequenceID」フィールドによって決定することができる。つまり、結果のすべての文書のI0(論理的に)またはq0..q5の場合は、[1、1、1、1、1、1] ]。

+0

複数の一致ステートメントが必要ですか?それが可能ならば可能です。 – rummykhan

+0

入力ドキュメントの例がないので推測するのは難しいです。私の答えで提案した解決策を駆動する可能性があります。 – profesor79

+0

@rummykhan必要なのは、パイプラインの同じステージで同時に動作する複数の一致ステートメントです。それは可能ですか? –

答えて

1

$実行後 - 選択されていないドキュメントはプロセスパイプから削除されます。私が提案することができるもの

は、我々は完全な結果セットを有するアレイ上で動作させることができる後

{ 
    $group:{ 
     _id:{include fields here}, 
     q0:{$push:"$q0"}, 
     ..............., 
     q5:{$push:"$q5"} 
}, 

} 

{ 
    $match : 
    { 
     "q0":"1" 
    } 
}, 

置き換えるです。

ので、私たちはあなたのために働く$filter

{ $filter: { input: "q0", as: q0Filtered, cond: {$eq:1} } } 

ウィルを使用することができますか?

すべての歓迎!

0

実際にはaggregateという関数はパイプラインとして知られています。これは、集計演算子のデータをパイプライン演算子からパイプライン演算子にパイプするだけであり、最終結果を得るために必要なパイプの量です。

e.g. 
$match -> $project -> $group -> $sort -> $match -> $sort -> $limit -> $project 

任意の演算子を複数回使用できます。追加する

db.getCollection('Messages').aggregate(
[ 
    { $match : { "header.MessageType" : { $in: ["04"] }}}, 
    { 
     $project: 
      { 
      _id: '$_id', 
      "MessageType": '$header.MessageType', 
      q0: { $arrayElemAt: [ "$content.Changes", 0 ] }, 
      q1: { $arrayElemAt: [ "$content.Changes", 1 ] }, 
      q2: { $arrayElemAt: [ "$content.Changes", 2 ] }, 
      q3: { $arrayElemAt: [ "$content.Changes", 3 ] }, 
      q4: { $arrayElemAt: [ "$content.Changes", 4 ] }, 
      q5: { $arrayElemAt: [ "$content.Changes", 5 ] }, 
      } 
    }, 
    {$match : { "q0" : "0" } }, 
    {$sort : { "q1" : -1}}, 
    {$match : {"q3" : "1"}} 
] 
) 

最後の事はあなたがインデックスを使用している場合でも、6つの試合の句を言っているようクエリを遅くする追加された場合にあなたのコレクションは、すべてのパイプにいくつかの時間がかかるだろう巨大です集約パイプラインからのデータしたがって、このパイプラインを賢明に使用してください。

+0

最初のマッチパイプは他のマッチステートメントで考慮する必要がある他のドキュメントからも外れません。それが問題です。 –

+0

私は何をして私の質問を更新することができるかをあなたに教えてもらった – rummykhan

関連する問題