Rust の MongoDB ドライバーである mongodb を使って、_id
を指定したドキュメント検索処理を実装します。
MongoDBのコレクションのドキュメントを検索する
- ObjectId::from_str:BSON形式のObjectIdを生成する
- find_one:指定されたクエリ条件を満たすドキュメントを”1つ”を取得する
Rust | MongoDBのドキュメントを検索する – find / find_one
RustのMongoDBドライバーであるmongodbを使い、findとfind_oneでドキュメント検索処理を実装します。
目次
MongoDB の “_id” 検索
MongoDB の設定
今回は以下のデータベースとコネクションを作成した前提で実装します。
- データベース:sample_db
- コレクション:users
Cargo.toml
mongodb クレートを使います。
[dependencies]
tokio = "1.20.0"
serde = { version = "1.0", features = ["derive"] }
[dependencies.mongodb]
version = "2.2.2"
default-features = false
features = ["tokio-runtime"]
ObjectIdを生成してfind_one
find_one で指定されたクエリ条件を満たす文書を1つを取得します。
_id
で検索をかける際のポイントは ObjectId です。
use mongodb::bson::doc;
use mongodb::bson::oid::ObjectId;
use mongodb::Client;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Deserialize, Serialize)]
struct User {
#[serde(rename = "_id", skip_serializing)]
id: Option<ObjectId>,
name: String,
}
#[tokio::main]
async fn main() -> mongodb::error::Result<()> {
let client = Client::with_uri_str("your connection url string").await?;
let db = client.database("sample_db");
let collection = db.collection::<User>("users");
let object_id = ObjectId::from_str("object id string");
if let Ok(oid) = object_id {
let filter = doc! {"_id": oid};
let result = collection.find_one(filter, None).await?;
if let Some(user) = result {
if let Some(id) = user.id {
println!("id: {}, name: {}", id, user.name);
}
}
}
Ok(())
}
NGな書き方
以下の書き方では、正しい結果が得られませんでした。
let filter = doc! {"_id": "object id string"};
let filter = doc! {"_id": {"$oid": "object id string"}};
1.は、ObjectIdとして認識されないため、NULLが返ります。(エラーは発生しません)
2.は、コンパイル時にエラーが発生しました。
Error: Error { kind: Command(CommandError { code: 2, code_name: "BadValue", message: "unknown operator: $oid" }), labels: {}, wire_version: Some(13), source: None }
まとめ
BSON形式であるObjectIdを検索で指定することができました。
プライマリーキー指定でドキュメントの操作をおこなう場合はObjectIdを扱うことになるでしょう。
コメント