Convert Struct with vector into Document MongoDB

hi everyone,
i'm try convert a struct to mongodb Document, but i have a field Vector inside, and i get a error when i try convert:
Then i created this little example, and i continue get the same error message.
Somebody can help-me?

  let vec1 = vec!( "a","b","c");
  let doc = doc!{ "vector" : (&vec1) };

let doc = doc!{ "vector" : (&vec1) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait std::convert::From<&std::vec::Vec<&str>> is not implemented for mongodb::Bson

I've noticed that the bson library seems to need ownership of some variables to do the conversion. There may just be a blanket impl missing in the library. Probably worth an upstream pr. In the meantime, try cloning your vec, and storing that in the struct.

I tried clone, copy, but don't work.
Stranger than a new vector empty is created without error.

      let doc = doc!{ "vector" : vec!( ) };  // it's work
let doc = doc!{ "vector" : vec1 };

or

let doc = doc!{ "vector" : vec1.clone() };

should work.

Don't work. unfortunately

error[E0277]: the trait bound mongodb::Bson: std::convert::From<std::vec::Vec<std::string::String>> is not satisfied
--> src\paciente\mod.rs:113:18
|
113 | let doc1 = doc!{ "vector" : _vec1.clone() };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait std::convert::From<std::vec::Vec<std::string::String>> is not implemented for mongodb::Bson
|
= help: the following implementations were found:
<mongodb::Bson as std::convert::From<&'a std::string::String>>
<mongodb::Bson as std::convert::From<&'a str>>
<mongodb::Bson as std::convert::From<(mongodb::spec::BinarySubtype, std::vec::Vec)>>
<mongodb::Bson as std::convert::From<(std::string::String, mongodb::ordered::OrderedDocument)>>
and 16 others
= note: required by std::convert::From::from
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)

Ah okay, in that case you should probably convert each individual item in the vector to a Bson:

let doc = doc!{
    "vector": vec1.into_iter().map(Bson::from).collect::<Vec<_>>()
};

But you could just look at the documentation of the bson crate and the Bson type and see for what types Bson::from is implemented.

1 Like

it's worked.
Very thanks, you saved my day.
i'm in process of assimilation of the language.

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.