【MongoDB】记录API日志非常方便且最佳选择(如果结合IntelliJ甚至更加方便)

はじめに

気にはなっていたけど、なかなか触れる機会が無かった。。
そんな、同じクラスのあの子のような存在、それがmongoDBでした。
実際、使ってみると手軽でとても使いやすい。

こちらの記事では、簡単にインストールから導入までをまとめてみました。

使用MongoDB进行开发的内容

在有趣的个人开发中,我使用了MongoDB。[利用API的比特币自动交易系统]

    • bitcoin値取得にCryptWatchAPIを使用

 

    • bitcoin売買にBitflyerAPIを使用

 

    • 開発言語:Node.js

 

    • 開発環境:macOS Catalina

 

    デプロイ環境: AWS:EC2:ubuntu18.04LTS

我使用 MongoDB 来记录比特币交易时的价格以及用于交易决策的值的日志。

MongoDB是什么

就算有誤解的可能性,我毫不猶豫地說出來,可以這樣說,

这是一个可以将数据以JSON格式记录在数据库中的数据库。

不好意思!在这里,我们优先考虑了易懂性 m(_ _)m
(请高手们不要扔石头。)

除了这些之外,还有其他一些选项,比如易于扩展的可伸缩性和无需预先定义的无模式化。如果您想了解更详细的信息,请查看以下推荐页面。
详细推荐页面1
详细推荐页面2

最适合记录API!

MongoDB的特点

    • スキーマレスで、

 

    JSON形式

这个非常适用于记录API。
也就是说,可以直接插入API响应的JSON!
而且,即使API的结构不断变化,也可以直接插入!
非常方便,因为是无模式的,所以不需要考虑太多,可以直接放进来。

这个是关系数据库管理系统(RDBMS)的话会怎么样?

    • スキーマを細かく定義した上で、例外処理を施し構造が変わるものは省いてインサートする。

string,textとしてまるごとインサート

这两个都很困难。
我们假设了可能接收到的JSON内容,并且在定义模式时将其详细设置,然后进行处理,将响应的JSON逐个分解到列中,或者编写异常处理等等。
第二个是可以直接插入的,但是即使是TEXT格式的列也有字符限制。
在mysql中,最大长度为65,535(216-1)个字符。当使用数据时,需要再次转换为JSON格式。
唉,我感觉要吐了(;´Д`)
而且,我已经放弃了节点之间的结构。

「现在虽然不知道用在什么地方,但是以后想要用在有趣的事情上,所以暂时先保存数据吧♪」这种心情非常适合使用MongoDB。

私のbitcoin売買システムも、
将来、趣味で分析したり、機械学習で回せたらオモロイだろうなーってノリだけです。
使えそうな値と、APIをまるごと、とりあえずインサートおく。
APIの構造が多少変わっても気にしない。

我建议您首先亲自体验一下其便捷性。
然后,我将简单总结一下安装步骤。

安装

苹果操作系统

您可以使用brew轻松安装。


brew install mongodb

#自動起動に設定
brew services start mongodb

ubuntu18.04LTS

ubuntuはやや面倒です。
aptの管理ライブラリが最新のMongDBとなっていないため、
Mongoの公式から、パッケージを展開してインストールする必要があります。


#パッケージ管理システムに公開鍵を登録
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

#ダウンロード用のリストファイルを作成
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list

#パッケージ管理システムのデータベースをリロード
sudo apt-get update

#最新の安定版をインストール
sudo apt-get install -y mongodb-org

#MongoDBを自動起動にする
sudo systemctl enable mongod

#MongoDBを起動
sudo service mongod start

树莓派

无法在树莓派上安装最新版本的MongoDB。

正确的是,Raspberry Pi的官方操作系统Raspbian OS无法安装MongoDB版本2.4.14以上。

由于RasbianOS只支持32位,因此上述的MongoDB版本仅支持64位。

実は、ラズパイ自体は64bitのため
OSに引きづられて最新のMongoDBが利用できなくなっています。
ですので、OSを入れ替えたら使用できるかもしれません。
詳しくはこちら

除非有特殊原因,否则不建议在树莓派上使用MongoDB,因为在Mongo 2.4及以下版本中,npm的Mongo库也不支持。

实施

数据库设置

在终端上创建一个Mongo数据库,并使其可供使用。

# MongoDBに入る
mongo

# データベース切り替え、作成
use db_name

#データベースの確認
show dbs

#使用しているデータベースを確認
db

#コレクションの作成
db.createCollection("collect_name")

#コレクションを確認
show collections

#コレクションにドキュメントをインサート
db.collect_name.insertOne({ name: "hoge", age: 88})

#コレクション内のドキュメントを確認
db.collect_name.find()

# MongoDBから抜ける
exit

稍微解释一下

    • use db_name: データベースは無ければ、自動で作成されます。

 

    • collection: mongoではtableでは無く、collectionと言います。

 

    document:mongoでは1つ1つのデータ(record)のことをdocumentと言います。

代码实现

我使用Node.js进行了实现。
以下是基本实现的例子。


const MongoClient = require('mongodb').MongoClient;
const options = {
  useUnifiedTopology : true,
  useNewUrlParser : true
};
const url = 'mongodb://localhost:27017';
const dbName = 'db_name';

//即時関数と、asyncを定義
(async function () {
  let client;

  try {
    client = await MongoClient.connect(
        url,
        options,
    );
    //DB取得
    const db = client.db(dbName);

    //DBを操作
    await insertDoc(db);
    await findDoc(db);
  } catch (err) {
    //接続失敗
    console.log(err);
  }

  //接続を切る
  client.close();
})();

//Insert
function insertDoc(db) {
  const collection = db.collection('collect_name');
  collection.insertMany(
      [{ name: 'hoge', age: 88 }, { name: 'fuga', age: 14 }],
      (err, result) => {
        console.log('Success inserted');
      },
  );
}

//Find
function findDoc(db) {
  const collection = db.collection('collect_name');
  collection.find({}).toArray((err, docs) => {
        //検索内容をコンソール出力
        console.log(docs);
      });
}

数据确认

我尝试使用Mongo获取了比特币的交易数据。

标准的数据确认

#terminalからの標準のデータ確認
{ 
"_id" : ObjectId("5df9c2ba73160d276ad2e3ad"), 
"flag" : "buy", 
"label" : "買い注文", 
"created_at" : ISODate("2019-12-18T06:10:02.072Z"), 
"strTime" : "2019/12/18 15:10:02", 
"price" : 737491, 
"shortMA" : 737293.825779211, 
"longMA" : 736227.9333333333, 
"countHigh" : 4, 
"records" : [ 735413, 735522, 735314, 735516, 735691, 735913, 736276, 736316, 736366, 736788, 736586, 736472, 735565, 735245, 735327, 735259, 735677, 735745, 736058, 736238, 736448, 736713, 736388, 736426, 736954, 737198, 736975, 737479, 737479, 737491 ] 
}

我来解释一下

    • _id: mongoから自動で振られるid

 

    • created_at: ISODATE形式、datetime形式でinsertすることができます。

 

    • shortMA: 過去5回分のpriceの移動平均金額を算出

 

    • longMA: 過去30回分のpriceの移動平均金額を算出

 

    records: 過去のpriceリスト。リスト形式でそのままinsertしています。

即使数据的格式是列表,甚至嵌套了树形结构,也可以进行插入操作。

使用Intellij(jetBrains)

如果使用命令行界面的话,相比关系数据库管理系统(RDBMS),它的可读性较差且不易查看。我推荐使用IDE或者软件来浏览数据。我个人使用的是IntelliJ。只需要进行一次连接设置,以后只需双击就可以连接到数据库并进行数据浏览。相比在终端输入命令,这种方式更加方便快捷且易于阅读。

スクリーンショット 2020-02-12 14.06.57.png
スクリーンショット 2020-02-12 14.06.12.png

如果非要提出不满的话,我希望在表格视图中,列的顺序不会混乱。
(因为MongoDB本身没有读取DDL中的列顺序的概念,所以这是无法解决的。)

最后

MongoDB是一种方便易用的数据库。
虽然没有明确决定如何使用API数据,但是暂时引入MongoDB并在以后考虑是一个不错的选择♪

非常感谢您一直阅读到最后。

广告
将在 10 秒后关闭
bannerAds