3
\$\begingroup\$

This update is based on a previous review where I tried creating a WriteConfig and a WriteConfigBuilder. I have updated this so I am only using the Config part and not the Builder.

The wire protocol for Mongo Insert is:

You will notice that of the 7 parameters 5 are optional and one is implied due to context. So I have shaped my API so that the required parameters is part of the interface and the user can pass the optional parameters in a separate optional config object (Rather than having a mass of insert() functions taking different number of parameters).

I am using this as an example. Because the findAndModify API has 13 optional parameters (and I want to use a similar patter for all the API). If this looks sensible then I can use this standard pattern.

class Collection
{
 ... STUFF removed.
 template<typename T>
 InsertResult insert(std::vector<T> const& data, InsertConfig const& config = InsertConfig{});
 template<typename... T>
 InsertResult insert(std::tuple<T...> const& data, InsertConfig const& config = InsertConfig{});
};

The optional config object is then defined like this:

class InsertConfig
{
 std::optional<bool> ordered;
 std::optional<std::uint32_t> maxTimeMS;
 std::optional<WriteConcern> writeConcern;
 std::optional<bool> bypassDocumentValidation;
 std::optional<std::string> comment;
 public:
 std::optional<bool> const& getOrdered() const {return ordered;}
 std::optional<std::uint32_t> const& getMaxTimeMS() const {return maxTimeMS;}
 std::optional<WriteConcern> const& getWriteConcern() const {return writeConcern;}
 std::optional<bool> const& getBypassDocumentValidation() const {return bypassDocumentValidation;}
 std::optional<std::string> const& getComment() const {return comment;}
 InsertConfig& setOrdered(bool value) {ordered.emplace(value); return *this;}
 InsertConfig& setMaxTimeMS(std::uint32_t value) {maxTimeMS.emplace(value); return *this;}
 InsertConfig& setWriteConcern(WriteConcern value) {writeConcern.emplace(value); return *this;}
 InsertConfig& setBypassDocumentValidation(bool value) {bypassDocumentValidation.emplace(value); return *this;}
 InsertConfig& setComment(std::string value) {comment.emplace(value); return *this;}
};

This allows the interface to be called like this:

mongo["DB"]["Collection"].insert(peopleVector,
 InsertConfig{}
 .setOrdered(true)
 .setComment("Add people")
 // Add more optional param here
 );

Nothing interesting to review in the actual insert() function.

toolic
14.5k5 gold badges29 silver badges203 bronze badges
asked Aug 16, 2024 at 0:03
\$\endgroup\$

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.