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

サブドキュメントから$sumを差し引く

    実際には、次のことを簡単に行うことができます:

    db.table.aggregate( [
      { "$match" : { "tenantId": "paul" } },
      //{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
      { "$project":
        "deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
      }}
    ])
    

    MongoDB 3.2以降、実際には $ project $ sum 引数の配列(または配列)であるため、 $ unwindする必要はありません。 まったく。

    「古い」方法である「長い」方法は、実際に $ unwind 、ただし、実際には $ project> $ groupに続く

    db.table.aggregate( [
      { "$match" : { "tenantId": "paul" } },
      { $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
      { "$group":
        "_id": "$_id",
        "price": { "$first": "$price" },
        "deposits": { "$sum": "$deposits.amount" }
      }},
      { "$project": {
        "deposits": { "$subtract": [ "$price", "$deposits" ] }
      }}
    ])
    

    そしてもちろん、 $ firstが必要です。 "price"を返すためのアキュムレータ $ groupのフィールド ステージなので、次のステージで使用できます。

    ただし、 prepareNullAndEmptyArraysを実行できる場合 、実際にはMongoDB 3.2を使用しているため、なしのステートメントを使用することをお勧めします。 $ unwind とにかく、そうするほうがはるかに速いからです。




    1. RedHat /CentOS7システムにMongoDB4.2をインストールする方法

    2. MongoDBオブジェクトプロパティ$はネストされた配列に存在します

    3. mongolab MongoDBデータベースに接続しようとすると、mongoose.connect()で2行のNodeJSアプリケーションがクラッシュする

    4. ClusterControlのパフォーマンスとヘルスモニタリング