#mongo-db #indexed #macro-derive #documentation #declaratively #user-name

mongo_indexed

derive macro to declaratively index mongo collections

10 releases (4 stable)

2.0.2 Jun 29, 2025
2.0.1 Aug 16, 2024
1.0.0 Jun 27, 2024
0.3.0 May 13, 2024
0.1.1 Nov 2, 2023

#693 in Rust patterns

Download history 44/week @ 2025-07-16 83/week @ 2025-07-23 50/week @ 2025-07-30 84/week @ 2025-08-06 102/week @ 2025-08-13 122/week @ 2025-08-20 80/week @ 2025-08-27 70/week @ 2025-09-03 59/week @ 2025-09-10 93/week @ 2025-09-17 42/week @ 2025-09-24 60/week @ 2025-10-01 50/week @ 2025-10-08 50/week @ 2025-10-15 76/week @ 2025-10-22 22/week @ 2025-10-29

204 downloads per month
Used in 2 crates

GPL-3.0-or-later

18KB
192 lines

Configure mongo indexing right on your rust structs

Example

use mongo_indexed::doc;
use mongo_indexed_derive::MongoIndexed;
use mongodb::{bson::oid::ObjectId, options::ClientOptions};
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, MongoIndexed)]
#[unique_doc_index({ "username": 1, "email": 1 })]
#[collection_name(users)] // By default, this will be the name of the struct it's defined on, in this case 'User'.
pub struct User {
    #[serde(rename = "_id")]
    pub id: ObjectId,

    #[index]
    pub username: String,

    #[index]
    pub email: String,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // instantiate your mongo client
    let mongo =
        mongodb::Client::with_options(ClientOptions::parse("mongodb://localhost:27017").await?)?;
    let db = mongo.database("my-db");

    // Since index calls are a no-op if the indexes do not change, your APIs can
    // safely use create_indexes = true even when restarting all the time. 
    // Just be careful if the indexes change and the collection is large.
    let create_indexes = true;

    // will return a handle to 'users' collection on 'my-db', which has the specified indexes created.
    let users = mongo_indexed::collection::<User>(&db, create_indexes).await?;

    let user = users.find_one(doc! { "username": "mogh" }, None).await?;
    println!("{user:?}");

    Ok(())
}

Dependencies

~11–24MB
~301K SLoC