Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rustは厳しいが役に立つ Part3「Rustでデータべース(MongoDB編)」
Search
NearMeの技術発表資料です
PRO
September 30, 2022
Programming
0
560
Rustは厳しいが役に立つ Part3「Rustでデータべース(MongoDB編)」
NearMeの技術発表資料です
PRO
September 30, 2022
Tweet
Share
More Decks by NearMeの技術発表資料です
See All by NearMeの技術発表資料です
ガウス過程回帰とベイズ最適化
nearme_tech
PRO
0
35
確率的プログラミング入門
nearme_tech
PRO
2
35
Observability and OpenTelemetry
nearme_tech
PRO
2
29
観察研究における因果推論
nearme_tech
PRO
1
72
React
nearme_tech
PRO
2
33
Architecture Decision Record (ADR)
nearme_tech
PRO
1
820
遺伝的アルゴリズムを実装する
nearme_tech
PRO
1
46
Fractional Derivative!
nearme_tech
PRO
1
37
GitHub Projectsにおける チケットの ステータス更新自動化について
nearme_tech
PRO
1
58
Other Decks in Programming
See All in Programming
OnlineTestConf: Test Automation Friend or Foe
maaretp
0
120
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
130
リアーキテクチャxDDD 1年間の取り組みと進化
hsawaji
1
220
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
650
React への依存を最小にするフロントエンド設計
takonda
15
4k
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
710
watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編
oniak3ibm
PRO
1
190
Amazon Bedrock Agentsを用いてアプリ開発してみた!
har1101
0
340
Contemporary Test Cases
maaretp
0
140
CSC509 Lecture 12
javiergs
PRO
0
160
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
Vapor Revolution
kazupon
1
210
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
Adopting Sorbet at Scale
ufuk
73
9.1k
Building Applications with DynamoDB
mza
90
6.1k
Testing 201, or: Great Expectations
jmmastey
38
7.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Thoughts on Productivity
jonyablonski
67
4.3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Transcript
0 Rustは厳しいが役に立つ Part3「Rustでデータべース(MongoDB編)」 2022-09-30 第15回NearMe技術勉強会 Kaito Asahi
1 目次 RustとMongoDB MongoDBについて ハンズオン!! 実際に簡単なアプリケーションをつくります
2 MongoDBとは? • Build faster. Build smarter. → 迅速そして賢いデータベースの構築 →
シャーディング、インメモリでの処理、レプリカセット • JSONライクにデータを扱っている • さまざまなユースケースがある(https://www.mongodb.com/ja-jp/use-cases) • データベース言語「SQL」を使えない ※次回以降で、MySQLについても扱います。 出典:https://www.mongodb.com/
3 ハンズオンのために 以下の作業をおこなってください。 (1) 必須 • Rust環境の構築(https://www.rust-lang.org/ja/tools/install) • MongoDBのインストール (https://www.mongodb.com/docs/manual/installation/)
(2) 任意 • Mongo Compassのインストール(GUIでデータベースを確認できる) (https://www.mongodb.com/try/download/compass)
4 データのインサート (0) 準備 src/bin/insert.rsを作成し、以下を追加してください。 use mongodb::{ bson::{doc, oid::ObjectId}, options::ClientOptions,
Client, }; use serde::{Deserialize, Serialize};
5 データのインサート (1) データベースクライアントを作成する main関数内に、以下の2つの変数を宣言する。 ※parseメソッドの引数は、一応各デバイスで確認してください。 ※基本のport番号は27017です。 let client_options =
ClientOptions::parse("mongodb://localhost:27017").await?; let client = Client::with_options(client_options)?;
6 データのインサート (2) データベースを作成し、コレクションを作成 main関数内に、以下の2つの変数を追加する。 let db = client.database("test_pokemon"); let
collection = db.collection::<Pokemon>("pokemons");
7 データのインサート (3) データの準備 3-1. main関数の外にPokemon構造体を作成する #[derive(Serialize, Deserialize)] struct Pokemon
{ #[serde(rename = "_id", skip_serializing)] id: Option<ObjectId>, name: String, where_from: String, }
8 データのインサート (3) データの準備 3-2. main関数内にポケモンのデータのサンプルを追加する。 let pokemons = vec![
Pokemon { id: None, name: "Bulbasaur".to_string(), where_from: "Kanto".to_string(), }, … ];
9 データのインサート (4) pokemonsドキュメントにデータを挿入する main関数内に、以下を追加する。 ※Ok(())は、main関数でResultを返すために置いてあります。 collection.insert_many(pokemons, None).await?; Ok(())
10 データのインサート (5) Mongo Compassで確認
11 データの検索 (0) 準備 src/bin/search.rsを作成し、以下を追加してください。 use futures::stream::TryStreamExt; use mongodb::{ bson::{doc,
oid::ObjectId}, options::{ClientOptions, FindOptions}, Client, }; use serde::{Deserialize, Serialize};
12 データの検索 (1) フィルターを作成する 先程のcollection変数の部分までは同じで、以下のようにフィルターを作成。 → ここでは、Venusaur(フシギバナ)を検索しています。 → sortは、”where_from”で逆順(-1)にしている。 let
filter = doc! {"name": "Venusaur"}; let find_options = FindOptions::builder().sort(doc! {"where_from": -1}).build();
13 データの検索 (2) フィルターをつけて検索する 先程のcollection変数の部分までは同じで、以下のようにフィルターを作成する。 ※awaitを用いて、検索が終了するまで、後に現れる検索結果の表示を行わないよ うにしています。 let mut cursor
= collection.find(filter, find_options).await?;
14 データの検索 (3) 検索結果の表示 検索して、データがあればそれを報告する。 while let Some(pokemon) = cursor.try_next().await?
{ if let name = pokemon.name { println!("name: {}, where from: {}", name, pokemon.where_from); } }
15 (おまけ)Pokeapiを用いて、全てのポケモンを取得しました 別途結果をお見せいたします。
16 参考リンクまとめ 1. MongoDB:https://www.mongodb.com/ 2. MongoDB Compass:https://www.mongodb.com/try/download/compass 3. Rust:https://www.rust-lang.org/ja/tools/install 4.
Rustでのデータベース作成について ・https://zenn.dev/kyoheiu/articles/c3b6b6f156e57a ・https://zenn.dev/tfutada/articles/e5bf173edd541b 5. Pokeapi:https://pokeapi.co/ 6. Rustでapiを叩く:https://qiita.com/odayushin/items/0e2a5a3d047e6b08c811
17 余談 Rustに関する本で、Webアプリに特化したものが出るらしいので、 速攻購入してブラッシュアップしていきたいです... https://www.shuwasystem.co.jp/book/9784798067315.html
18 Thank you