Struct mongodm::repository::Repository[][src]

pub struct Repository<M: Model> { /* fields omitted */ }
Expand description

Associate a mongodb::Collection and a specific Model.

This type can safely be copied and passed around because std::sync::Arc is used internally. Underlying mongodb::Collection can be retrieved at anytime with Repository::get_underlying.

Implementations

Create a new repository from the given mongo client.

Create a new repository with associated collection options (override Model::coll_options).

Returns associated M::collection_name.

Returns underlying mongodb::Collection.

Convert this repository to use another Model. Only compiles if both Model::CollConf are identicals.

Example

use mongodm::{ToRepository, Model, CollectionConfig};
use mongodm::mongo::bson::doc;
use mongodm::f;
use serde::{Serialize, Deserialize};

struct UserCollConf;

impl CollectionConfig for UserCollConf {
    fn collection_name() -> &'static str {
        "cast_model"
    }
}

// Latest schema currently in use
#[derive(Serialize, Deserialize)]
struct User {
    username: String,
    last_seen: i64,
}

impl Model for User {
    type CollConf = UserCollConf;
}

// Old schema
#[derive(Serialize, Deserialize)]
struct UserV1 {
    name: String,
    ls: i64,
}

// Versionned version of our `User`
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
enum UserVersionned {
    Last(User),
    V1(UserV1),
}

impl Model for UserVersionned {
    type CollConf = UserCollConf; // same as the non-versionned version
}

// We have some repository for `User`
let repo = db.repository::<User>();

// Assume the following document is stored: { "name": "Bernard", "ls": 1500 }

// Following query should fails because the schema doesn't match
let err = repo.find_one(doc!{ f!(name in UserV1): "Bernard" }, None).await.err().unwrap();
assert_eq!(err.to_string(), "missing field `username`"); // serde deserialization error

// We can get a repository for `UserVersionned` from our `Repository<User>`
// because `User::CollConf` == `UserVersionned::CollConf`
let repo_versionned = repo.cast_model::<UserVersionned>();

// Our versionned model should match with the document
let ret = repo_versionned.find_one(doc!{ f!(name in UserV1): "Bernard" }, None).await?;
match ret {
    Some(UserVersionned::V1(UserV1 { name, ls: 1500 })) if name == "Bernard" => { /* success */ }
    _ => panic!("Expected document was missing"),
}

Following code will fail to compile because CollectionConfig doesn’t match.

use mongodm::{ToRepository, Model, CollectionConfig};
use serde::{Serialize, Deserialize};

struct ACollConf;

impl CollectionConfig for ACollConf {
    fn collection_name() -> &'static str { "a" }
}

#[derive(Serialize, Deserialize)]
struct A;

impl Model for A {
    type CollConf = ACollConf;
}

struct BCollConf;

impl CollectionConfig for BCollConf {
    fn collection_name() -> &'static str { "B" }
}

#[derive(Serialize, Deserialize)]
struct B;

impl Model for B {
    type CollConf = BCollConf;
}

// Doesn't compile because `A` and `B` doesn't share the same `CollectionConfig`.
db.repository::<A>().cast_model::<B>();

Drops the underlying collection, deleting all data, users, and indexes stored inside.

Runs an aggregation operation.

Mongo manual

Estimates the number of documents in the collection using collection metadata.

Gets the number of documents matching filter.

Note that using Repository::estimated_document_count is recommended instead of this method is most cases.

Deletes all documents stored in the collection matching query.

Deletes up to one document found matching query.

Finds the distinct values of the field specified by field_name across the collection.

Finds the documents in the collection matching filter.

Finds a single document in the collection matching filter.

Atomically finds up to one document in the collection matching filter and deletes it.

Atomically finds up to one document in the collection matching filter and replaces it with replacement.

Atomically finds up to one model in the collection matching filter and updates it.

Both Document and Vec<Document> implement Into<UpdateModifications>, so either can be passed in place of constructing the enum case. Note: pipeline updates are only supported in MongoDB 4.2+.

Inserts the models into the collection.

Inserts model M into the collection.

Replaces up to one document matching query in the collection with replacement.

Updates all documents matching query in the collection.

Both Document and Vec<Document> implement Into<UpdateModifications>, so either can be passed in place of constructing the enum case. Note: pipeline updates are only supported in MongoDB 4.2+. See the official MongoDB documentation for more information on specifying updates.

Updates up to one document matching query in the collection.

Both Document and Vec<Document> implement Into<UpdateModifications>, so either can be passed in place of constructing the enum case. Note: pipeline updates are only supported in MongoDB 4.2+. See the official MongoDB documentation for more information on specifying updates.

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Performs the conversion.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Performs the conversion.

Should always be Self

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

recently added

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.