Довольно новый для Монго и не смог понять, как выполнить запрос.
У меня есть коллекция accounts
, которая выглядит следующим образом:
{
"_id" : ObjectId("1"),
"time" : ISODate("2018-10-20T05:57:15.372Z"),
"profileId" : "1",
"totalUSD" : "1015.5513030613",
"accounts" : [
{
"_id" : ObjectId("2"),
"accountId" : "1",
"currency" : "USD",
"balance" : "530.7934159683763000",
"available" : "530.7934159683763",
"hold" : "0.0000000000000000",
"exchangeRateUSD" : "1"
},
{
"_id" : ObjectId("5"),
"accountId" : "4",
"currency" : "BTC",
"balance" : "0.0759214200000000",
"available" : "0.07592142",
"hold" : "0.0000000000000000",
"exchangeRateUSD" : "6384.995"
},
],
}
Iхранить только exchangeRateUSD для каждой валюты, а не exchangeRateXXX, где XXX - имя валюты, поскольку может быть произвольное количество валют и валютных пар.Но когда я запрашиваю коллекцию счетов, она всегда запрашивается валютной парой, например, BTC-USD.На данный момент все просто, я могу предположить, что валютная пара всегда будет XXX-USD.
Когда я запрашиваю коллекцию счетов, я хотел бы добавить «виртуальное» поле для каждого объекта счета: exchangeRateCrypto
а затем в документ об учетных записях верхнего уровня я хотел бы добавить totalCrypto
, который будет просто общим значением учетной записи в данном крипто.Например: баланс счета в долларах США * exchangeRateCrypto + баланс крипто-счета * exchangeRateCrypto (который будет равен 1).
Мой текущий запрос без exchangeRateCrypto
и totalCrypto
выглядит следующим образом:
db.accounts.aggregate([
{ $unwind: '$accounts' },
{ $match: { 'accounts.currency': { $in: [ 'USD', 'BTC' ] }}},
{
$group: {
_id: '$_id',
time: { $first: '$time' },
profileId: { $first: '$profileId' },
accounts: { $push: '$accounts' },
totalUSD: { $sum: { $multiply: [ { $toDouble: '$accounts.balance' }, { $toDouble: '$accounts.exchangeRateUSD' } ] } }
}
}
]);
Я пытаюсь выяснить, как «добраться» до строки BTC и вычислить exchangeRateCrypto
, просто выполнив 1 / exchangeRateUSD
, а затем спроецировать / вернуть документ счетов и поддокумент как:
{
"_id" : ObjectId("1"),
"time" : ISODate("2018-10-20T05:57:15.372Z"),
"profileId" : "1",
"totalUSD" : "1015.5513030613",
"totalCrypto" : "0.1590527953", // 530.7934159683763 * 0.0001566171939 + 0.07592142 * 1
"accounts" : [
{
"_id" : ObjectId("2"),
"accountId" : "1",
"currency" : "USD",
"balance" : "530.7934159683763000",
"available" : "530.7934159683763",
"hold" : "0.0000000000000000",
"exchangeRateUSD" : "1",
"exchangeRateCrypto" : "0.0001566171939", // 1 / 6384.995
},
{
"_id" : ObjectId("5"),
"accountId" : "4",
"currency" : "BTC",
"balance" : "0.0759214200000000",
"available" : "0.07592142",
"hold" : "0.0000000000000000",
"exchangeRateUSD" : "6384.995",
"exchangeRateCrypto" : "1"
},
],
}
, ноЯ не смог найти хороший способ сделать это.
Кажется, это должно быть довольно просто, но все еще изучать Монго.
Есть какие-нибудь советы?
Спасибо!