日本の山岳一覧・百名山 API を開発しましたCLICK !

Rust | MongoDBのドキュメントを”_id”で検索する – find_one

Rust x MogoDB
  • URLをコピーしました!

Rust の MongoDB ドライバーである mongodb を使って、_idを指定したドキュメント検索処理を実装します。

MongoDBのコレクションのドキュメントを検索する

  1. ObjectId::from_str:BSON形式のObjectIdを生成する
  2. find_one:指定されたクエリ条件を満たすドキュメントを”1つ”を取得する
目次

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な書き方

以下の書き方では、正しい結果が得られませんでした。

  1. let filter = doc! {"_id": "object id string"};
  2. 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を扱うことになるでしょう。

Rust x MogoDB

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!

コメント

コメントする

目次