mongo_derive

Crates.iomongo_derive
lib.rsmongo_derive
version0.1.1
created_at2025-03-06 05:24:06.196669+00
updated_at2025-03-07 21:35:13.284675+00
descriptionProcedural macros for simplified MongoDB operations in Rust
homepage
repositoryhttps://github.com/HaikelO/mongo_derive
max_upload_size
id1580586
size85,357
(HaikelO)

documentation

README

mongo_derive

A Rust procedural macro crate that simplifies MongoDB operations by generating update builders for your structs.

Features

  • MongoOperations derive macro for generating update builders with typesafe methods
  • Support for $set, $push, and $pull MongoDB operations
  • Nested field handling with the mongo_nested_fields attribute
  • Path-based updates for flexibility

Installation

Add this to your Cargo.toml:

[dependencies]
mongo_derive = "0.1.0"

Usage

Basic Usage

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

#[derive(Serialize, Deserialize, Clone, 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
}

fn main() -> Result<(), mongodb::error::Error> {
    // 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?;

    println!("{:?}", update);
    Ok(())
}

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,
}

fn main() -> Result<(), mongodb::error::Error> {
    // 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()?;

    println!("{:?}", update);
    Ok(())
}

How It Works

The crate generates update builder structs that create MongoDB update documents with the proper operators:

  • $set for replacing field values
  • $push for adding to arrays
  • $pull for removing from arrays

The builder pattern ensures type safety while giving you the flexibility of MongoDB's update operators.

License

This project is licensed under the MIT License.

Commit count: 5

cargo fmt