#mongo-db #index #indexed #collection #derive #bson #mongo-indexed

macro mongo_indexed_derive

derive macro to declaratively index mongo collections

6 releases (2 stable)

2.0.0 Aug 16, 2024
1.0.0 Jun 27, 2024
0.3.0 May 13, 2024
0.2.2 Jan 13, 2024
0.1.0 Nov 2, 2023

#19 in #mongo

Download history 13/week @ 2024-07-21 37/week @ 2024-07-28 42/week @ 2024-08-04 197/week @ 2024-08-11 63/week @ 2024-08-18 26/week @ 2024-08-25 11/week @ 2024-09-01 17/week @ 2024-09-08 36/week @ 2024-09-15 38/week @ 2024-09-22 51/week @ 2024-09-29 47/week @ 2024-10-06 48/week @ 2024-10-13 58/week @ 2024-10-20 35/week @ 2024-10-27 26/week @ 2024-11-03

172 downloads per month
Used in 3 crates (via mongo_indexed)

GPL-3.0-or-later

5KB
111 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

~240–690KB
~16K SLoC