userver: userver/storages/mongo/bulk.hpp Source File
Loading...
Searching...
No Matches
bulk.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/storages/mongo/bulk.hpp
4/// @brief Bulk collection operation model
5
6#include <userver/storages/mongo/bulk_ops.hpp>
7#include <userver/storages/mongo/options.hpp>
8#include <userver/utils/fast_pimpl.hpp>
9
10USERVER_NAMESPACE_BEGIN
11
12namespace storages::mongo::impl::cdriver {
13class CDriverCollectionImpl;
14class CDriverTransactionCollectionImpl;
15} // namespace storages::mongo::impl::cdriver
16
17namespace storages::mongo::operations {
18
19/// Efficiently executes a number of operations over a single collection
20class Bulk {
21public:
22 enum class Mode { kOrdered, kUnordered };
23
24 explicit Bulk(Mode);
25 ~Bulk();
26
27 Bulk(const Bulk&) = delete;
28 Bulk(Bulk&&) noexcept;
29 Bulk& operator=(const Bulk&) = delete;
30 Bulk& operator=(Bulk&&) noexcept;
31
32 bool IsEmpty() const;
33
34 void SetOption(options::WriteConcern::Level);
35 void SetOption(const options::WriteConcern&);
36 void SetOption(options::SuppressServerExceptions);
37
38 /// Inserts a single document
39 template <typename... Options>
40 void InsertOne(formats::bson::Document document, Options&&... options);
41
42 /// @brief Replaces a single matching document
43 /// @see options::Upsert
44 template <typename... Options>
45 void ReplaceOne(formats::bson::Document selector, formats::bson::Document replacement, Options&&... options);
46
47 /// @brief Updates a single matching document
48 /// @see options::Upsert
49 template <typename... Options>
50 void UpdateOne(formats::bson::Document selector, formats::bson::Document update, Options&&... options);
51
52 /// @brief Updates a single matching document with an aggregation pipeline
53 /// @note `update` must be either an update document or an aggregation pipeline array
54 /// @note Available starting in MongoDB 4.2
55 /// @see options::Upsert
56 template <typename... Options>
57 void UpdateOne(formats::bson::Document selector, formats::bson::Value update, Options&&... options);
58
59 /// @brief Updates all matching documents
60 /// @see options::Upsert
61 template <typename... Options>
62 void UpdateMany(formats::bson::Document selector, formats::bson::Document update, Options&&... options);
63
64 /// @brief Updates all matching documents with an aggregation pipeline
65 /// @note `update` must be either an update document or an aggregation pipeline array
66 /// @note Available starting in MongoDB 4.2
67 /// @see options::Upsert
68 template <typename... Options>
69 void UpdateMany(formats::bson::Document selector, formats::bson::Value update, Options&&... options);
70
71 /// Deletes a single matching document
72 template <typename... Options>
73 void DeleteOne(formats::bson::Document selector, Options&&... options);
74
75 /// Deletes all matching documents
76 template <typename... Options>
77 void DeleteMany(formats::bson::Document selector, Options&&... options);
78
79 /// @name Prepared sub-operation inserters
80 /// @{
81 void Append(const bulk_ops::InsertOne&);
82 void Append(const bulk_ops::ReplaceOne&);
83 void Append(const bulk_ops::Update&);
84 void Append(const bulk_ops::Delete&);
85 /// @}
86
87private:
88 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
89 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
90
91 class Impl;
92 static constexpr size_t kSize = 56;
93 static constexpr size_t kAlignment = 8;
94 // MAC_COMPAT: std::string size differs
95 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
96};
97
98template <typename... Options>
99void Bulk::InsertOne(formats::bson::Document document, Options&&... options) {
100 bulk_ops::InsertOne insert_subop(std::move(document));
101 (insert_subop.SetOption(std::forward<Options>(options)), ...);
102 Append(insert_subop);
103}
104
105template <typename... Options>
106void Bulk::ReplaceOne(formats::bson::Document selector, formats::bson::Document replacement, Options&&... options) {
107 bulk_ops::ReplaceOne replace_subop(std::move(selector), std::move(replacement));
108 (replace_subop.SetOption(std::forward<Options>(options)), ...);
109 Append(replace_subop);
110}
111
112template <typename... Options>
113void Bulk::UpdateOne(formats::bson::Document selector, formats::bson::Document update, Options&&... options) {
114 bulk_ops::Update update_subop(bulk_ops::Update::Mode::kSingle, std::move(selector), std::move(update));
115 (update_subop.SetOption(std::forward<Options>(options)), ...);
116 Append(update_subop);
117}
118
119template <typename... Options>
120void Bulk::UpdateOne(formats::bson::Document selector, formats::bson::Value update, Options&&... options) {
121 bulk_ops::Update update_subop(bulk_ops::Update::Mode::kSingle, std::move(selector), std::move(update));
122 (update_subop.SetOption(std::forward<Options>(options)), ...);
123 Append(update_subop);
124}
125
126template <typename... Options>
127void Bulk::UpdateMany(formats::bson::Document selector, formats::bson::Document update, Options&&... options) {
128 bulk_ops::Update update_subop(bulk_ops::Update::Mode::kMulti, std::move(selector), std::move(update));
129 (update_subop.SetOption(std::forward<Options>(options)), ...);
130 Append(update_subop);
131}
132
133template <typename... Options>
134void Bulk::UpdateMany(formats::bson::Document selector, formats::bson::Value update, Options&&... options) {
135 bulk_ops::Update update_subop(bulk_ops::Update::Mode::kMulti, std::move(selector), std::move(update));
136 (update_subop.SetOption(std::forward<Options>(options)), ...);
137 Append(update_subop);
138}
139
140template <typename... Options>
141void Bulk::DeleteOne(formats::bson::Document selector, Options&&... options) {
142 bulk_ops::Delete delete_subop(bulk_ops::Delete::Mode::kSingle, std::move(selector));
143 (delete_subop.SetOption(std::forward<Options>(options)), ...);
144 Append(delete_subop);
145}
146
147template <typename... Options>
148void Bulk::DeleteMany(formats::bson::Document selector, Options&&... options) {
149 bulk_ops::Delete delete_subop(bulk_ops::Delete::Mode::kMulti, std::move(selector));
150 (delete_subop.SetOption(std::forward<Options>(options)), ...);
151 Append(delete_subop);
152}
153
154} // namespace storages::mongo::operations
155
156USERVER_NAMESPACE_END