преобразование sql в агрегат mongodb

#sql #mongodb

Вопрос:

Я новичок в SQL и MongoDB. Я пытаюсь преобразовать это:

 SELECT accountType, ROUND(AVG(balance), 2) avgBalance
FROM customers
WHERE gender="female"
GROUP BY accountType
HAVING COUNT(*) < 140
ORDER BY avgBalance
LIMIT 1 
 

в MongoDB, но я не могу заставить его работать. Я не совсем понимаю, каким должен быть порядок ($group, $match, $project, $round, $avg и т. Д.) И как «РАУНД и СРЕДНИЙ» используются вместе. Вот как должен выглядеть ответ: { «Тип учетной записи» : «тип учетной записи», «Средний баланс» : число десятичных(«9999.99») }

Вот что у меня есть до сих пор:

 db.customers.aggregate( [ { $group: { _id: { accountType: "accountType", avgBalance: { $avg: { "balance" } } }, { $match: { count: { $lt: 140 } } }, { gender: "female" }, { $project: { "accountType": { $round: [ $agv: "balance", 2 ] } } }, { $limit: 1 } ] )
 

Ответ №1:

Направление неплохое, было бы вот это:

 db.customers.aggregate([
   //  WHERE gender="female"
   { $match: { gender: "female" } },
   // GROUP BY accountType, SELECT AVG(balance)
   {
      $group: {
         _id: "$accountType",
         avgBalance: { $avg: "$balance" },
         count: {$sum: 1}
      }
   },
   // HAVING COUNT(*) < 140
   { $match: { count: { $lt: 140 } } },
   // SELECT ... AS ...
   {
      $project: {
         accountType: "$_id",
         avgBalance: { $round: ["$avgBalance", 2] }
      }
   },
   // ORDER BY avgBalance
   { $sort: { avgBalance: 1 } },
   // LIMIT 1
   { $limit: 1 }
])
 

Комментарии:

1. Спасибо! 🙂 Я немного изменил его, чтобы придать ему правильную форму, но средний баланс дает мне «ноль», и я не знаю, почему. Вот измененный mongo: db.customers.aggregate([ { $соответствие: { пол: «женский» } }, { $группа: { _id: «Тип учетной записи», средний баланс: { $средний: «баланс» }, количество: {$сумма: 1} } }, { $соответствие: { количество: { $lt: 140 } } }, { $проект: { _id: 0, тип учетной записи: «$_id», средний баланс: { $раунд: [«баланс$», 2] }}}, { $сортировка: { среднее значение: 1 } }, { $предел: 1 }])

2. Может быть, из-за этого: «баланс» : десятичное число(«3485.90»)?

3. Пожалуйста, отредактируйте свой вопрос и введите дополнительный код. Пожалуйста, также предоставьте некоторые примеры входных данных. Смотрите мое обновление -> > avgBalance: { $round: ["$avgBalance", 2] } .

4. Спасибо вам за ваш совет. Я не заметил, что можно отредактировать исходный вопрос. Извини за это. И спасибо вам за ваше обновление, я перепробовал почти все, что мог придумать, но не это.