2016-05-24 10 views
-2

で平均を取得するので、私は私が1,000,000.00より大きい口座残高をすべてのアカウントの平均口座残高を取得したいこの情報はMongoDBの

{ "_id" : ObjectId("574462ffbb61fc35622bd1f3"), "first_name" : "GEORGE", "last_name" : "SMITH", "accounts" : [ { "account_type" : "Checking", "account_balance" : 7510049.716676093, "currency" : "PESO" }, { "account_type" : "Investment", "account_balance" : 8978088.436168617, "currency" : "USD" }, { "account_type" : "401K", "account_balance" : 3536582.866462197, "currency" : "YEN" }, { "account_type" : "Checking", "account_balance" : 4390095.46173461, "currency" : "USD" } ] } 

{ "_id" : ObjectId("574462ffbb61fc35622bd1f4"), "first_name" : "STEVEN", "last_name" : "SMITH", "accounts" : [ { "account_type" : "Investment", "account_balance" : 7606194.17605087, "currency" : "EURO" }, { "account_type" : "Investment", "account_balance" : 2099711.775821766, "currency" : "EURO" }, { "account_type" : "Investment", "account_balance" : 2961011.973269031, "currency" : "YUAN" }, { "account_type" : "Savings", "account_balance" : 5830306.873168334, "currency" : "USD" }, { "account_type" : "401K", "account_balance" : 1542091.8696738125, "currency" : "EURO" } ] } 

{ "_id" : ObjectId("574462ffbb61fc35622bd1f5"), "first_name" : "BRIAN", "last_name" : "SMITH", "accounts" : [ { "account_type" : "401K", "account_balance" : 149839.10500178766, "currency" : "PESO" } ] } 

{ "_id" : ObjectId("574462ffbb61fc35622bd1f6"), "first_name" : "EDWARD", "last_name" : "SMITH", "accounts" : [ { "account_type" : "401K", "account_balance" : 6577381.434625924, "currency" : "YEN" }, { "account_type" : "Checking", "account_balance" : 8998935.759297138, "currency" : "USD" }, { "account_type" : "Investment", "account_balance" : 588000.4045217587, "currency" : "YUAN" }, { "account_type" : "Savings", "account_balance" : 6743563.754405159, "currency" : "YUAN" }, { "account_type" : "401K", "account_balance" : 8580650.627761671, "currency" : "POUNDS STERLING" }, { "account_type" : "401K", "account_balance" : 7687815.685781645, "currency" : "YEN" }, { "account_type" : "Checking", "account_balance" : 9128407.633252997, "currency" : "EURO" } ] } 

を持つこのコレクション名bankdataを、持っています。

私はこのクエリを作成しましたが、平均勘定残高の取得方法はわかりません。

db.bankdata.find({ accounts: { $elemMatch : { 'account_balance' : { $gt: 1000000 } } } }, { 'accounts.$' : 1, first_name: 1, last_name: 1}) 

答えて

0

あなたは集計フレームワークを使用することができるかもしれません。しかし、正直言って、あなたは止めて、あなたが正確にやりたいことを考えなければなりません。

私はあなたの質問の詳細をすばやく見ていましたが、すでに私を殴っていました。

  1. モデルのデザインを変更することをおすすめします。たぶんaccount_typeは、勘定タイプの文書への参照である必要がありますか?たぶんaccountsは、アカウント文書を参照する必要があります。あなたは1つの文書にすべてを入れていますが、私にはそれは正しく見えません。あなたが望むならそれをすることができますが、間違いなくもっとうまくいくことができます。
  2. 2番目に重要です。 MongoDBは、金融アプリケーションにはまったく適していません。これは、浮動小数点数がMongoDBが格納する形式で精度を失うためです。その影響を理解するには、浮動小数点について読んでおく必要があります。要するに、浮動小数点は、必要な正確な値で保存できないことがあります。浮動小数点値を合計すると、これは目立つ結果になります。

私はあなたが一歩前進して達成したいことを考えてみることをお勧めします。それが学習目的のためであれば、まあまあ何かを学んだだけです。
それ以外の場合は、必要な精度まで10進数を格納できるデータベースを使用することをお勧めします。トランザクションを処理する必要があるためACID制約があります。

0

このようなグループ分けで平均を得ることができます。

db.bank.aggregate([{$unwind:"$accounts"},{$match:{"accounts.balance":{"$gt":35555}}},{$group:{_id:{name:"$firstname"},avgbalance:{$avg:"$accounts.balance"}}}]) 

を(私はちょうどあなたがそれに応じて属性名を変更する必要があります。ダミーのコレクションを作成した)しかし、私はまたElyasinの入力に基づいて再検討するだろう。

https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/

上記のコマンドを使用しているものについての詳細を持っています。 最初にグループ化する必要があるので、各要素の配列を分解します。 を入力し、「a」の値より大きいバランスを持つようにpiplelineでMatchを追加します。 そして最後に要素にグループ化します(ここではfirstnameを使用しました)。$ avgはmongoコマンドです。