use crate::error::Error;
use mongodb::{
bson::Document,
options::{FindOneAndUpdateOptions, UpdateOptions},
results::UpdateResult,
ClientSession, Collection,
};
use serde::{Deserialize, Serialize};
pub async fn update_one<D>(
collection: &Collection<D>,
query: Document,
update: Document,
options: Option<UpdateOptions>,
session: Option<&mut ClientSession>,
) -> Result<UpdateResult, Error>
where
D: Serialize + for<'a> Deserialize<'a> + Send + Sync,
{
let result = if let Some(session) = session {
collection
.update_one(query, update)
.with_options(options)
.session(session)
.await
} else {
collection
.update_one(query, update)
.with_options(options)
.await
}
.map_err(Error::Mongo)?;
Ok(result)
}
pub async fn update_many<D>(
collection: &Collection<D>,
query: Document,
update: Document,
options: Option<UpdateOptions>,
session: Option<&mut ClientSession>,
) -> Result<UpdateResult, Error>
where
D: Serialize + for<'a> Deserialize<'a> + Send + Sync,
{
let result = if let Some(session) = session {
collection
.update_many(query, update)
.with_options(options)
.session(session)
.await
} else {
collection
.update_many(query, update)
.with_options(options)
.await
}
.map_err(Error::Mongo)?;
Ok(result)
}
pub async fn find_one_and_update<D>(
collection: &Collection<D>,
query: Document,
update: Document,
options: Option<FindOneAndUpdateOptions>,
session: Option<&mut ClientSession>,
) -> Result<Option<D>, Error>
where
D: Serialize + for<'a> Deserialize<'a> + Send + Sync,
{
let result = if let Some(session) = session {
collection
.find_one_and_update(query, update)
.with_options(options)
.session(session)
.await
} else {
collection
.find_one_and_update(query, update)
.with_options(options)
.await
}
.map_err(Error::Mongo)?;
Ok(result)
}