【发布时间】:2021-09-09 17:01:55
【问题描述】:
我有一个用 mysql 编写的查询,但我不知道如何使用聚合在 mongodb 中编写完全相同的查询。我尝试了几次,但没有成功。
这是 MYSQL 查询:
"INSERT INTO `dailyprice`( `coin_id`, `avg_price_usd`, `avg_price_btc`, `24h_volume_usd`, `market_cap_usd`, `high`, `low`, `open`, `close`, `date`) SELECT coin_id, AVG( price_usd ) as avg_price_usd, AVG( price_btc ) as avg_price_btc, 24h_volume_usd, market_cap_usd,
MAX( price_usd ) as high,
MIN( price_usd ) as low,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price_usd AS CHAR ) ORDER BY last_updated ASC ) , ',', 1 ) AS open,
SUBSTRING_INDEX( GROUP_CONCAT( CAST( price_usd AS CHAR ) ORDER BY last_updated DESC ) , ',', 1 ) AS close,
'".$today." 00:00:00' as last_updated
FROM hourlyprice
WHERE DATE(last_updated) = DATE('".$today."')
GROUP BY coin_id
ORDER BY coin_id";
这是我尝试过但没有用的查询:
const dummy = await DemoHourly.aggregate([
{ $match: {}},
{ "$project": {'slug': '$slug', 'avgPriceUsd': { $avg: "$priceUsd" }, 'avgPriceBtc': { $avg: "$priceBtc" }, 'volumeUsd24h': 'volumeUsd24h', 'marketcapUsd': 'marketcapUsd', 'high': { $max: "$priceUsd" }, 'low': { $min: "$priceUsd"},
'open': { $substr: [ {sortBy: {'priceUsd': 1}}, ',', 1 ] },
'close': { $substr: [ {sortBy: {'priceUsd': -1}}, ',', 1 ] }, 'date': '$lastUpdated'}},
{"$group" : {slug: "$slug"}},
{"$sort": {slug: "$slug"}},
{"$out": 'DemoDaily'},
]);
示例数据如下:
> {"_id":{"$oid":"6138391e692a88047c9932ec"},"slug":"bitcoin-cash","lastUpdated":{"$date":{"$numberLong":"1630975170000"}},"priceUsd":{"$numberDecimal":"778.9255851705683"},"priceBtc":{"$numberDecimal":"0.01485905922493417"},"volumeUsd24h":{"$numberDecimal":"3525016631.607257"},"marketcapUsd":{"$numberDecimal":"14674188835.59815"},"__v":{"$numberInt":"0"}}
> {"_id":{"$oid":"6138391e692a88047c9932ea"},"slug":"bitcoin-cash","lastUpdated":{"$date":{"$numberLong":"1630973970000"}},"priceUsd":{"$numberDecimal":"780.8554493856429"},"priceBtc":{"$numberDecimal":"0.01484304670433461"},"volumeUsd24h":{"$numberDecimal":"3537000197.3464494"},"marketcapUsd":{"$numberDecimal":"14710545571.669245"},"__v":{"$numberInt":"0"}}
> {"_id":{"$oid":"6138391e692a88047c9932f0"},"slug":"bitcoin-cash","lastUpdated":{"$date":{"$numberLong":"1630977558000"}},"priceUsd":{"$numberDecimal":"780.4696085884976"},"priceBtc":{"$numberDecimal":"0.014836168061202465"},"volumeUsd24h":{"$numberDecimal":"3513387446.1191416"},"marketcapUsd":{"$numberDecimal":"14703276712.068815"},"__v":{"$numberInt":"0"}}
> {"_id":{"$oid":"6138391e692a88047c99343c"},"slug":"cardano","lastUpdated":{"$date":{"$numberLong":"1630977571000"}},"priceUsd":{"$numberDecimal":"2.82392726000138"},"priceBtc":{"$numberDecimal":"0.00005368083389917269"},"volumeUsd24h":{"$numberDecimal":"4552465993.487997"},"marketcapUsd":{"$numberDecimal":"90440076524.85124"},"__v":{"$numberInt":"0"}}
> {"_id":{"$oid":"6138391e692a88047c993435"},"slug":"cardano","lastUpdated":{"$date":{"$numberLong":"1630973370000"}},"priceUsd":{"$numberDecimal":"2.84529094801866"},"priceBtc":{"$numberDecimal":"0.000053960276764135886"},"volumeUsd24h":{"$numberDecimal":"4598913635.5157795"},"marketcapUsd":{"$numberDecimal":"91124281421.3245"},"__v":{"$numberInt":"0"}}
> {"_id":{"$oid":"6138391e692a88047c993440"},"slug":"cardano","lastUpdated":{"$date":{"$numberLong":"1630979977000"}},"priceUsd":{"$numberDecimal":"2.81250795077164"},"priceBtc":{"$numberDecimal":"0.000053563761437665065"},"volumeUsd24h":{"$numberDecimal":"4557377263.532797"},"marketcapUsd":{"$numberDecimal":"90074357756.09015"},"__v":{"$numberInt":"0"}}
现在,我想将数据插入到另一个表中
任何人的帮助将不胜感激,感谢 DemoDaily 它将按 slug 分组和排序,还做很多其他的事情,比如打开和关闭,这是特定 slug 的最高和最低价格。您可以查看mysql查询以获得更多了解。
【问题讨论】:
-
你能提供样本数据和你期望的输出吗?
-
@mohammadNaimi 请检查我是否已编辑我的问题!
-
所以让我知道您只想在这些聚合之后将此数据放入另一个集合中?
-
是的,这就是每天使用 cron 将数据从 hourlytable 传输到 dailyprice 表。
-
感谢您的工作,请提供样本输出
标签: mongodb mongoose mongodb-query