2016-05-24 4 views
-2

Так что у меня это имена коллекции bankdata, где у меня есть эта информацияПолучения в среднем 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" } ] } 

Я хочу, чтобы получить средний баланс счета для всех счетов с балансом счета больше, чем 1,000,000.00.

Я сделал этот запрос, но не знаю, как получить средний баланс на счете.

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

ответ

0

Вы можете быть в состоянии использовать совокупный рамки. Но, честно говоря, вы должны остановиться и подумать о том, что вы хотите сделать именно так.

У меня только был быстрый взгляд на ваши детали вопроса, но это уже поразило меня.

  1. Возможно, вы захотите перепроектировать свою модель. Может быть, account_type должен быть ссылкой на документ типов счетов? Возможно, accounts должны быть ссылками на документы счета. Вы помещаете все в один документ, но для меня это выглядит неправильно. Вы можете сделать это, если хотите, но вы определенно можете сделать лучше.
  2. Второй и самый важный. MongoDB вообще не подходит для финансовых приложений. Это связано с тем, что числа с плавающей запятой теряют точность в формате MongoDB; вы должны прочитать о плавающих очках, чтобы понять влияние. Суть в том, что плавающие точки когда-то не могут быть сохранены с точным значением, которое вы хотите получить. И когда вы суммируете значения с плавающей запятой, это будет заметно и ваши результаты будут неправильными.

Предлагаю вам сделать шаг назад и рассмотреть, чего вы хотите достичь. Если это для учебных целей, вы просто что-то узнали.
В противном случае я рекомендую использовать базу данных, в которой можно хранить десятичные числа без потери до необходимой вам/определенной точности, и которая предлагает ограничения 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/

содержит информацию о том, что с помощью команды выше. Сначала деконструируйте массив для каждого элемента, как вам нужно сгруппировать по ним. , а затем добавьте Match в pipleline, чтобы баланс был больше значения «a». и, наконец, группа на элементе (я использовал здесь первое имя) $ avg - команда mongo.