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 with associated collection options (override Model::coll_options
).
Returns associated M::collection_name
.
Returns underlying mongodb::Collection
.
pub fn cast_model<OtherModel>(self) -> Repository<OtherModel> where
OtherModel: Model<CollConf = M::CollConf>,
[src]
pub fn cast_model<OtherModel>(self) -> Repository<OtherModel> where
OtherModel: Model<CollConf = M::CollConf>,
[src]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.
pub async fn aggregate(
&self,
pipeline: impl IntoIterator<Item = Document>,
options: impl Into<Option<AggregateOptions>>
) -> Result<ModelCursor<M>>
[src]
pub async fn aggregate(
&self,
pipeline: impl IntoIterator<Item = Document>,
options: impl Into<Option<AggregateOptions>>
) -> Result<ModelCursor<M>>
[src]Runs an aggregation operation.
pub async fn estimated_document_count(
&self,
options: impl Into<Option<EstimatedDocumentCountOptions>>
) -> Result<i64>
[src]
pub async fn estimated_document_count(
&self,
options: impl Into<Option<EstimatedDocumentCountOptions>>
) -> Result<i64>
[src]Estimates the number of documents in the collection using collection metadata.
pub async fn count_documents(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<CountOptions>>
) -> Result<i64>
[src]
pub async fn count_documents(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<CountOptions>>
) -> Result<i64>
[src]Gets the number of documents matching filter
.
Note that using Repository::estimated_document_count
is recommended instead of this method is most cases.
pub async fn delete_many(
&self,
query: Document,
options: impl Into<Option<DeleteOptions>>
) -> Result<DeleteResult>
[src]
pub async fn delete_many(
&self,
query: Document,
options: impl Into<Option<DeleteOptions>>
) -> Result<DeleteResult>
[src]Deletes all documents stored in the collection matching query
.
pub async fn delete_one(
&self,
query: Document,
options: impl Into<Option<DeleteOptions>>
) -> Result<DeleteResult>
[src]
pub async fn delete_one(
&self,
query: Document,
options: impl Into<Option<DeleteOptions>>
) -> Result<DeleteResult>
[src]Deletes up to one document found matching query
.
Finds the distinct values of the field specified by field_name
across the collection.
pub async fn find(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<FindOptions>>
) -> Result<ModelCursor<M>>
[src]
pub async fn find(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<FindOptions>>
) -> Result<ModelCursor<M>>
[src]Finds the documents in the collection matching filter
.
Finds a single document in the collection matching filter
.
pub async fn find_one_and_delete(
&self,
filter: Document,
options: impl Into<Option<FindOneAndDeleteOptions>>
) -> Result<Option<M>>
[src]
pub async fn find_one_and_delete(
&self,
filter: Document,
options: impl Into<Option<FindOneAndDeleteOptions>>
) -> Result<Option<M>>
[src]Atomically finds up to one document in the collection matching filter
and deletes it.
pub async fn find_one_and_replace(
&self,
filter: Document,
replacement: &M,
options: impl Into<Option<FindOneAndReplaceOptions>>
) -> Result<Option<M>>
[src]
pub async fn find_one_and_replace(
&self,
filter: Document,
replacement: &M,
options: impl Into<Option<FindOneAndReplaceOptions>>
) -> Result<Option<M>>
[src]Atomically finds up to one document in the collection matching filter
and replaces it with
replacement
.
pub async fn find_one_and_update(
&self,
filter: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<FindOneAndUpdateOptions>>
) -> Result<Option<M>>
[src]
pub async fn find_one_and_update(
&self,
filter: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<FindOneAndUpdateOptions>>
) -> Result<Option<M>>
[src]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+.
pub async fn insert_many(
&self,
models: impl IntoIterator<Item = M>,
options: impl Into<Option<InsertManyOptions>>
) -> Result<InsertManyResult>
[src]
pub async fn insert_many(
&self,
models: impl IntoIterator<Item = M>,
options: impl Into<Option<InsertManyOptions>>
) -> Result<InsertManyResult>
[src]Inserts the models into the collection.
pub async fn insert_one(
&self,
model: &M,
options: impl Into<Option<InsertOneOptions>>
) -> Result<InsertOneResult>
[src]
pub async fn insert_one(
&self,
model: &M,
options: impl Into<Option<InsertOneOptions>>
) -> Result<InsertOneResult>
[src]Inserts model M
into the collection.
pub async fn replace_one(
&self,
query: Document,
replacement: &M,
options: impl Into<Option<ReplaceOptions>>
) -> Result<UpdateResult>
[src]
pub async fn replace_one(
&self,
query: Document,
replacement: &M,
options: impl Into<Option<ReplaceOptions>>
) -> Result<UpdateResult>
[src]Replaces up to one document matching query
in the collection with replacement
.
pub async fn update_many(
&self,
query: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<UpdateOptions>>
) -> Result<UpdateResult>
[src]
pub async fn update_many(
&self,
query: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<UpdateOptions>>
) -> Result<UpdateResult>
[src]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.
pub async fn update_one(
&self,
query: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<UpdateOptions>>
) -> Result<UpdateResult>
[src]
pub async fn update_one(
&self,
query: Document,
update: impl Into<UpdateModifications>,
options: impl Into<Option<UpdateOptions>>
) -> Result<UpdateResult>
[src]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
Auto Trait Implementations
impl<M> !RefUnwindSafe for Repository<M>
impl<M> Send for Repository<M> where
M: Send,
impl<M> Sync for Repository<M> where
M: Sync,
impl<M> Unpin for Repository<M> where
M: Unpin,
impl<M> !UnwindSafe for Repository<M>
Blanket Implementations
Mutably borrows from an owned value. Read more
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
Instruments this type with the provided Span
, returning an
Instrumented
wrapper. Read more
type Output = T
type Output = T
Should always be Self
pub fn vzip(self) -> V