【问题标题】:How to write this MYSQL query to Mongodb?如何将此 MYSQL 查询写入 Mongodb?
【发布时间】: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


【解决方案1】:

https://mongoplayground.net/p/Oak49MpxvCc 我创建您的查询只是我认为问题出在打开和关闭字段中,如果有任何问题告诉我,

db.collection.aggregate([
  {
    $match: {}
  },
  {
    "$group": {
      "_id": "$slug",
      "avgPriceUsd": {
        $avg: "$priceUsd"
      },
      "avgPriceBtc": {
        $avg: "$priceBtc"
      },
      "high": {
        $max: "$priceUsd"
      },
      "low": {
        $min: "$priceUsd"
      },
      "orig": {
        $push: "$$ROOT"
      }
    }
  },
  {
    "$unwind": "$orig"
  },
  {
    "$project": {
      "slug": "1",
      "avgPriceUsd": 1,
      "avgPriceBtc": 1,
      "volumeUsd24h": "$orig.volumeUsd24h",
      "marketcapUsd": "$orig.marketcapUsd",
      "high": 1,
      "low": 1,
      "date": "$orig.lastUpdated",
      "open": {
        "$substr": [
          "$low",
          0,
          1
        ]
      },
      "close": {
        "$substr": [
          "$high",
          0,
          1
        ]
      }
    }
  },
  {
    $sort: {
      slug: 1
    }
  },
  {
    "$out": "DemoDaily"
  }
])

【讨论】:

  • 显示此错误:(node:8132) UnhandledPromiseRejectionWarning: MongoServerError: Exceeded memory limit for $group, 但不允许外部排序。通过 allowDiskUse:true 选择加入。(我已经通过了 { allowDiskUse: true })
  • 在 mongodb 连接选项中是否添加了`{allowDiskUse: true }`?
  • 不,我已在此处添加查询。但是我可以在哪里添加连接?
  • 加个赞,我说错了,应该加到这样的查询db.stocks.aggregate( [ { $sort : { cusip : 1, date: 1 } } ], { allowDiskUse: true } )
  • 作为聚合的第二个参数
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 2013-07-29
  • 1970-01-01
  • 2014-10-13
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多