pub struct GridFs {
pub bucket: GridFsBucket,
}
Expand description
A structure to control a GridFsBucket
.
https://www.mongodb.com/docs/manual/core/gridfs/
Example Usage:
let db: Database = ...;
let options = GridFsBucketOptions::builder()
.bucket_name(Some("bucket_name".to_string()))
.build();
let grid_fs = GridFs::new(&db, Some(options));
let file: tokio::fs::File = File::open("some path").await?;
let file_stream = file.compat();
grid_fs.upload("filename", file_stream, None).await?;
let mut writer: futures_util::io::Cursor<Vec<u8>> = Cursor::new(vec![]);
grid_fs.download("filename", &mut writer, None).await?;
grid_fs.rename("filename", "new_filename", None).await?;
// Most methods take a Option<i32> for a revision number
grid_fs.delete_by_filename("filename", Some(-1)).await?;
Fields§
§bucket: GridFsBucket
Implementations§
Source§impl GridFs
impl GridFs
Sourcepub fn new(db: &Database, options: Option<GridFsBucketOptions>) -> Self
pub fn new(db: &Database, options: Option<GridFsBucketOptions>) -> Self
Construct a new GridFs
containing a single bucket.
Example Usage:
let db: Database = ...;
let options = GridFsBucketOptions::builder()
.bucket_name(Some("bucket_name".to_string()))
.build();
let grid_fs = GridFs::new(&db, Some(options));
Sourcepub async fn drop(&self) -> Result<(), Error>
pub async fn drop(&self) -> Result<(), Error>
Drops all files and chunks from self.bucket
Example Usage:
let grid_fs: GridFs = ...;
grid_fs.drop().await?;
Sourcepub async fn size(&self) -> Result<(usize, usize), Error>
pub async fn size(&self) -> Result<(usize, usize), Error>
Returns the size in bytes and the number of files
in self.bucket
.
Example Usage:
let grid_fs: GridFs = ...;
let (total_bytes, total_files) = grid_fs.size().await?;
Sourcepub async fn exists(&self, filename: &str) -> Result<bool, Error>
pub async fn exists(&self, filename: &str) -> Result<bool, Error>
Returns true if a file by filename
exists in the bucket.
Example Usage:
let grid_fs: GridFs = ...;
if grid_fs.exists("filename").await? {
...
}
Sourcepub async fn find_one(
&self,
filter: Document,
sort: Option<Document>,
) -> Result<Option<FilesCollectionDocument>, Error>
pub async fn find_one( &self, filter: Document, sort: Option<Document>, ) -> Result<Option<FilesCollectionDocument>, Error>
Find one file document by a filter.
Example Usage:
let grid_fs: GridFs = ...;
let document_option: Option<FilesCollectionDocument> = grid_fs.find_one(
doc! { ... },
None::<Document>,
).await?;
Sourcepub async fn upload<S>(
&self,
filename: &str,
source: S,
options: Option<GridFsUploadOptions>,
) -> Result<ObjectId, Error>
pub async fn upload<S>( &self, filename: &str, source: S, options: Option<GridFsUploadOptions>, ) -> Result<ObjectId, Error>
Upload a file to GridFS via a source
returning its ObjectId
.
The mongodb
crate implements io to the bucket via futures_util
,
so the source S
must implement futures_io::AsyncRead + Unpin
.
However, if you are using “tokio”, you can call .compat()
to
wrap it into a source that implements futures_io::AsyncRead
.
See: https://docs.rs/tokio-util/latest/tokio_util/compat/index.html
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("some file path").await?;
let file_metadata = doc! { ... };
let options = GridFsUploadOptions::builder()
.metadata(Some(file_metadata))
.build();
let oid: ObjectId = grid_fs.upload(
"file_one",
file.compat(),
Some(options),
).await?;
Sourcepub async fn open_upload_stream(
&self,
filename: &str,
options: Option<GridFsUploadOptions>,
) -> Result<GridFsUploadStream, Error>
pub async fn open_upload_stream( &self, filename: &str, options: Option<GridFsUploadOptions>, ) -> Result<GridFsUploadStream, Error>
Open a GridFsUploadStream
via a files filename
. You can
obtain the ObjectId
from GridFsUploadStream.id
.
If multiple files under the same filename
exist, and you want
to download a specific revision (instead of the most recent) then
provide a revision
number.
Revision numbers are defined as follows:
0 = the original stored file
1 = the first revision
2 = the second revision
etc...
-2 = the second most recent revision
-1 = the most recent revision
Example Usage:
let grid_fs: GridFs = ...;
let upload_stream: GridFsUploadOptions = grid_fs
.open_download_stream(
"filename",
None::<GridFsUploadOptions>,
)
.await?;
Sourcepub async fn download<D>(
&self,
filename: &str,
destination: &mut D,
revision: Option<i32>,
) -> Result<usize, Error>where
D: AsyncWrite + Unpin,
pub async fn download<D>(
&self,
filename: &str,
destination: &mut D,
revision: Option<i32>,
) -> Result<usize, Error>where
D: AsyncWrite + Unpin,
Download a file from GridFS via a async writer destination
.
If multiple files under the same filename
exist, and you want
to download a specific revision (instead of the most recent) then
provide a revision
number.
Revision numbers are defined as follows:
0 = the original stored file
1 = the first revision
2 = the second revision
etc...
-2 = the second most recent revision
-1 = the most recent revision
The mongodb
crate implements io to the bucket via futures_util
,
so the destination D
must implement futures_io::AsyncWrite + Unpin
.
However, if you are using “tokio”, you can call .compat_write()
to
wrap it into a source that implements futures_io::AsyncWrite
.
See: https://docs.rs/tokio-util/latest/tokio_util/compat/index.html
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
grid_fs.upload(
"filename",
file.compat(),
None::<GridFsUploadOptions>,
).await?;
// If writer implements tokio::AsyncWrite,
// you would need to call `.compat_write()`
let mut writer = futures_util::io::Cursor::new(vec![]);
grid_fs.download(
"filename",
&mut writer,
None::<i32>,
).await?;
let uploaded_data: Vec<u8> = writer.into_inner();
Sourcepub async fn open_download_stream(
&self,
filename: &str,
revision: Option<i32>,
) -> Result<GridFsDownloadStream, Error>
pub async fn open_download_stream( &self, filename: &str, revision: Option<i32>, ) -> Result<GridFsDownloadStream, Error>
Open a GridFsDownloadStream
via a files filename
.
If multiple files under the same filename
exist, and you want
to download a specific revision (instead of the most recent) then
provide a revision
number.
Revision numbers are defined as follows:
0 = the original stored file
1 = the first revision
2 = the second revision
etc...
-2 = the second most recent revision
-1 = the most recent revision
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
let file_stream = file.compat();
grid_fs.upload("filename", file_stream, None).await?;
let download_stream: GridFsDownloadStream = grid_fs
.open_download_stream(
"filename",
None::<i32>,
)
.await?;
Sourcepub async fn find_many(
&self,
filter: Document,
options: Option<GridFsFindOptions>,
) -> Result<FindManyCursor<FilesCollectionDocument>, Error>
pub async fn find_many( &self, filter: Document, options: Option<GridFsFindOptions>, ) -> Result<FindManyCursor<FilesCollectionDocument>, Error>
Find many files by a filter Document
, returning
a cursor to iterate over.
Example Usage:
let grid_fs: GridFs = ...;
let mut cursor: FindManyCursor<FilesCollectionDocument> = grid_fs.find_many(
doc! { ... },
None::<GridFsFindOptions>,
).await?;
// Iteration
while let Some(file_document: FilesCollectionDocument) = cursor.next().await? {
...
}
// Or to get all at once:
let documents: Vec<FilesCollectionDocument> = cursor.all().await?;
Sourcepub async fn delete_many(
&self,
filter: Document,
options: Option<GridFsFindOptions>,
) -> Result<usize, Error>
pub async fn delete_many( &self, filter: Document, options: Option<GridFsFindOptions>, ) -> Result<usize, Error>
Delete many files by a filter Document
.
All file revisions will be deleted for those
that match the filter, as the filename
field
is taken from the document and deleted by
GridFs::delete_by_filename
with no revision
number.
Example Usage:
let grid_fs: GridFs = ...;
grid_fs.delete_many(
doc! { ... },
None::<GridFsFindOptions>,
).await?;
Sourcepub async fn rename_by_filename(
&self,
filename: &str,
new_filename: &str,
revision: Option<i32>,
) -> Result<usize, Error>
pub async fn rename_by_filename( &self, filename: &str, new_filename: &str, revision: Option<i32>, ) -> Result<usize, Error>
Rename a, or all, files by filename
, returns the amount
of files renamed.
If multiple files under the same filename
exist, and you want
to rename a specific revision (instead of all revisions) then
provide a revision
number.
Revision numbers are defined as follows:
0 = the original stored file
1 = the first revision
2 = the second revision
etc...
-2 = the second most recent revision
-1 = the most recent revision
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
grid_fs.upload(
"filename",
file.compat(),
None::<GridFsUploadOptions>,
).await?;
let renamed_files: usize = grid_fs.rename_by_filename(
"filename",
"new_filename"
None::<i32>,
).await?;
Sourcepub async fn rename_by_oid(
&self,
oid: ObjectId,
new_filename: &str,
) -> Result<(), Error>
pub async fn rename_by_oid( &self, oid: ObjectId, new_filename: &str, ) -> Result<(), Error>
Rename a file by its _id
field
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
grid_fs.upload(
"filename",
file.compat(),
None::<GridFsUploadOptions>,
).await?;
grid_fs.rename_by_oid(oid, "new_filename").await?;
Sourcepub async fn delete_by_filename(
&self,
filename: &str,
revision: Option<i32>,
) -> Result<usize, Error>
pub async fn delete_by_filename( &self, filename: &str, revision: Option<i32>, ) -> Result<usize, Error>
Delete a, or all, files by filename
, returns the amount
of files deleted.
If multiple files under the same filename
exist, and you want
to delete a specific revision (instead of all revisions) then
provide a revision
number.
Revision numbers are defined as follows:
0 = the original stored file
1 = the first revision
2 = the second revision
etc...
-2 = the second most recent revision
-1 = the most recent revision
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
grid_fs.upload(
"filename",
file.compat(),
None::<GridFsUploadOptions>,
).await?;
let deleted_files: usize = grid_fs.delete_by_filename(
"filename",
"new_filename"
None::<i32>,
).await?;
Sourcepub async fn delete_by_oid(&self, oid: ObjectId) -> Result<(), Error>
pub async fn delete_by_oid(&self, oid: ObjectId) -> Result<(), Error>
Delete a file by its _id
field
Example Usage:
let grid_fs: GridFs = ...;
let file = tokio::fs::File::open("path").await?;
grid_fs.upload(
"filename",
file.compat(),
None::<GridFsUploadOptions>,
).await?;
grid_fs.delete_by_oid(oid).await?;
Auto Trait Implementations§
impl Freeze for GridFs
impl !RefUnwindSafe for GridFs
impl Send for GridFs
impl Sync for GridFs
impl Unpin for GridFs
impl !UnwindSafe for GridFs
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.