Crate mongo_derive

Source
Expand description

§mongo-derive

mongo-derive is a procedural macro crate that simplifies working with MongoDB in Rust applications. It generates update builders for your structs that make it easy to create MongoDB update operations while maintaining type safety.

§Usage examples

§Basic usage with the MongoOperations derive macro:

use mongo_derive::MongoOperations;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, MongoOperations)]
struct User {
    #[mongo_ops(set)]
    name: String,
     
    #[mongo_ops(set, push, pull)]
    tags: Vec<String>,
     
    #[mongo_ops(none)]
    password_hash: String, // Excluded from update builder
}

// Create an update document
let update = User::update_builder()
    .set_name("John Doe".to_string())
    .push_tags("rust".to_string())
    .build()?;
     
// Use with MongoDB driver
// collection.update_one(query, update, None).await?;

§Working with nested fields:

use mongo_derive::{MongoOperations, mongo_nested_fields};
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Clone, MongoOperations)]
struct Address {
    #[mongo_ops(set)]
    city: String,
     
    #[mongo_ops(set)]
    street: String,
}

#[mongo_nested_fields(address: "Address", settings: "UserSettings")]
#[derive(Serialize, Deserialize,  Clone, MongoOperations)]
struct User {
    #[mongo_ops(set)]
    name: String,
     
    address: Address,
}

#[derive(Serialize, Deserialize,  Clone, MongoOperations)]
struct UserSettings {
    #[mongo_ops(set)]
    theme: String,
}

// Update nested fields
let update = User::update_builder()
    .with_address(|builder| {
        builder.set_city("New York".to_string())
    })
    .address("zipcode", "10001".to_string())? // Direct path access
    .build()?;

Attribute Macros§

mongo_nested_fields
An attribute macro that generates methods for working with nested fields.

Derive Macros§

MongoOperations
A derive macro that generates an update builder for a struct.