Struct GridFs

Source
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

Source

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));
Source

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?;
Source

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?;
Source

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? {
    ...
}
Source

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?;
Source

pub async fn upload<S>( &self, filename: &str, source: S, options: Option<GridFsUploadOptions>, ) -> Result<ObjectId, Error>
where S: AsyncRead + Unpin,

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?;
Source

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?;
Source

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();
Source

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?;
Source

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?;
Source

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?;
Source

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?;
Source

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?;
Source

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?;
Source

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T