sql >> データベース >  >> NoSQL >> MongoDB

MongoアグリゲーションとJavaforループおよびパフォーマンス

    Aggregationを使用すると、クエリ全体がMongoDBサーバー上で単一のプロセスとして実行されます。アプリケーションプログラムはサーバーから結果カーソルを取得します。

    Javaプログラムを使用すると、アプリケーションの処理への入力としてデータベースサーバーからカーソルを取得することもできます。サーバーからの応答カーソルは、より大きなデータセットになり、より多くのネットワーク帯域幅を使用します。そして、アプリケーションプログラムで処理が行われ、クエリを完了するための手順がさらに追加されます。

    すべての処理(最初の一致と配列のフィルタリング)はデータベースサーバー上で単一のプロセスとして行われるため、集計オプションの方が適していると思います。

    また、投稿した集計クエリの手順は効率的な方法で実行できることに注意してください。複数のステージ(2、3、4、および5)の代わりに、これらの操作を2つのステージで実行できます。 -$projectを使用します $mapを使用 外側の配列で$filter 内側の配列でそして $filter 外側の配列。

    集計:

    db.test.aggregate( [
      { 
          $addFields: { 
              Field2: { 
                  $map: {
                       input: "$Field2",
                          as: "fld2",
                          in: {
                               Field3: "$$fld2.Field3",
                               Field4: { 
                                   $filter: {
                                       input: "$$fld2.Field4",
                                          as: "fld4",
                                        cond: {  $eq: [ "$$fld4.id", "123" ] }
                                   }
                               }
                           }
                     } 
              }
          }
      },
      { 
          $addFields: { 
              Field2: { 
                  $filter: {
                       input: "$Field2",
                          as: "f2",
                        cond: {  $gt: [ { $size: "$$f2.Field4" }, 0 ] }
                  }
              }
          }
      },
    ] )
    


    1. @CompoundIndexがSpringDataMongoDBで機能しない

    2. Railsカスタム環境Resque.enqueueはジョブを作成しません

    3. Mongoで$addToSetのキーを指定できますか?

    4. MongoDB複合インデックスの使用法