userver: userver/storages/mongo/operations.hpp Source File
Loading...
Searching...
No Matches
operations.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/storages/mongo/operations.hpp
4/// @brief Collection operation models
5
6#include <userver/formats/bson/document.hpp>
7#include <userver/formats/bson/value.hpp>
8#include <userver/storages/mongo/options.hpp>
9#include <userver/utils/fast_pimpl.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace storages::mongo::impl::cdriver {
14class CDriverCollectionImpl;
15class CDriverTransactionCollectionImpl;
16} // namespace storages::mongo::impl::cdriver
17
18/// Collection operations
19namespace storages::mongo::operations {
20
21/// Counts documents matching the filter
22class Count {
23public:
24 explicit Count(formats::bson::Document filter);
25 ~Count();
26
27 Count(const Count&);
28 Count(Count&&) noexcept;
29 Count& operator=(const Count&);
30 Count& operator=(Count&&) noexcept;
31
32 void SetOption(const options::ReadPreference&);
33 void SetOption(options::ReadPreference::Mode);
34 void SetOption(options::ReadConcern);
35 void SetOption(options::Skip);
36 void SetOption(options::Limit);
37 void SetOption(const options::MaxServerTime&);
38 void SetOption(const options::Hint&);
39
40private:
41 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
42 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
43
44 class Impl;
45 static constexpr size_t kSize = 96;
46 static constexpr size_t kAlignment = 8;
47 // MAC_COMPAT: std::string size differs
48 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
49};
50
51/// Returns approximate number of documents in a collection
53public:
54 CountApprox();
55 ~CountApprox();
56
57 CountApprox(const CountApprox&);
58 CountApprox(CountApprox&&) noexcept;
59 CountApprox& operator=(const CountApprox&);
60 CountApprox& operator=(CountApprox&&) noexcept;
61
62 void SetOption(const options::ReadPreference&);
63 void SetOption(options::ReadPreference::Mode);
64 void SetOption(options::ReadConcern);
65 void SetOption(options::Skip);
66 void SetOption(options::Limit);
67 void SetOption(const options::MaxServerTime&);
68
69private:
70 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
71 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
72
73 class Impl;
74 static constexpr size_t kSize = 72;
75 static constexpr size_t kAlignment = 8;
76 // MAC_COMPAT: std::string size differs
77 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
78};
79
80/// Retrieves documents matching the filter
81class Find {
82public:
83 explicit Find(formats::bson::Document filter);
84 ~Find();
85
86 Find(const Find&);
87 Find(Find&&) noexcept;
88 Find& operator=(const Find&);
89 Find& operator=(Find&&) noexcept;
90
91 void SetOption(const options::ReadPreference&);
92 void SetOption(options::ReadPreference::Mode);
93 void SetOption(options::ReadConcern);
94 void SetOption(options::Skip);
95 void SetOption(options::Limit);
96 void SetOption(options::Projection);
97 void SetOption(const options::Sort&);
98 void SetOption(const options::Hint&);
99 void SetOption(options::AllowPartialResults);
100 void SetOption(options::Tailable);
101 void SetOption(const options::Comment&);
102 void SetOption(const options::MaxServerTime&);
103
104private:
105 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
106 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
107
108 class Impl;
109 static constexpr size_t kSize = 96;
110 static constexpr size_t kAlignment = 8;
111 // MAC_COMPAT: std::string size differs
112 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
113};
114
115/// Inserts a single document
117public:
118 explicit InsertOne(formats::bson::Document document);
119 ~InsertOne();
120
121 InsertOne(const InsertOne&);
122 InsertOne(InsertOne&&) noexcept;
123 InsertOne& operator=(const InsertOne&);
124 InsertOne& operator=(InsertOne&&) noexcept;
125
126 void SetOption(options::WriteConcern::Level);
127 void SetOption(const options::WriteConcern&);
128 void SetOption(options::SuppressServerExceptions);
129
130private:
131 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
132 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
133
134 class Impl;
135 static constexpr size_t kSize = 80;
136 static constexpr size_t kAlignment = 8;
137 // MAC_COMPAT: std::string size differs
138 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
139};
140
141/// Inserts multiple documents
143public:
144 InsertMany();
145 explicit InsertMany(std::vector<formats::bson::Document> documents);
146 ~InsertMany();
147
148 InsertMany(const InsertMany&);
149 InsertMany(InsertMany&&) noexcept;
150 InsertMany& operator=(const InsertMany&);
151 InsertMany& operator=(InsertMany&&) noexcept;
152
153 void Append(formats::bson::Document document);
154
155 void SetOption(options::Unordered);
156 void SetOption(options::WriteConcern::Level);
157 void SetOption(const options::WriteConcern&);
158 void SetOption(options::SuppressServerExceptions);
159
160private:
161 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
162 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
163
164 class Impl;
165 static constexpr size_t kSize = 88;
166 static constexpr size_t kAlignment = 8;
167 // MAC_COMPAT: std::string size differs
168 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
169};
170
171/// Replaces a single document
173public:
174 ReplaceOne(formats::bson::Document selector, formats::bson::Document replacement);
175 ~ReplaceOne();
176
177 ReplaceOne(const ReplaceOne&);
178 ReplaceOne(ReplaceOne&&) noexcept;
179 ReplaceOne& operator=(const ReplaceOne&);
180 ReplaceOne& operator=(ReplaceOne&&) noexcept;
181
182 void SetOption(options::Upsert);
183 void SetOption(options::WriteConcern::Level);
184 void SetOption(const options::WriteConcern&);
185 void SetOption(options::SuppressServerExceptions);
186
187private:
188 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
189 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
190
191 class Impl;
192 static constexpr size_t kSize = 96;
193 static constexpr size_t kAlignment = 8;
194 // MAC_COMPAT: std::string size differs
195 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
196};
197
198/// Updates documents
199class Update {
200public:
201 enum class Mode { kSingle, kMulti };
202
203 Update(Mode mode, formats::bson::Document selector, formats::bson::Document update);
204 ~Update();
205
206 Update(const Update&);
207 Update(Update&&) noexcept;
208 Update& operator=(const Update&);
209 Update& operator=(Update&&) noexcept;
210
211 void SetOption(options::Upsert);
212 void SetOption(options::RetryDuplicateKey);
213 void SetOption(options::WriteConcern::Level);
214 void SetOption(const options::WriteConcern&);
215 void SetOption(options::SuppressServerExceptions);
216 void SetOption(const options::ArrayFilters&);
217
218 /// @note Available starting in MongoDB 4.2.1
219 void SetOption(const options::Hint&);
220
221private:
222 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
223 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
224
225 class Impl;
226 static constexpr size_t kSize = 96;
227 static constexpr size_t kAlignment = 8;
228 // MAC_COMPAT: std::string size differs
229 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
230};
231
232/// Deletes documents
233class Delete {
234public:
235 enum class Mode { kSingle, kMulti };
236
237 Delete(Mode mode, formats::bson::Document selector);
238 ~Delete();
239
240 Delete(const Delete&);
241 Delete(Delete&&) noexcept;
242 Delete& operator=(const Delete&);
243 Delete& operator=(Delete&&) noexcept;
244
245 void SetOption(options::WriteConcern::Level);
246 void SetOption(const options::WriteConcern&);
247 void SetOption(options::SuppressServerExceptions);
248
249 /// @note Available starting in MongoDB 4.4
250 void SetOption(const options::Hint&);
251
252private:
253 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
254 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
255
256 class Impl;
257 static constexpr size_t kSize = 80;
258 static constexpr size_t kAlignment = 8;
259 // MAC_COMPAT: std::string size differs
260 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
261};
262
263/// Atomically updates a document and returns either previous or new version
265public:
266 FindAndModify(formats::bson::Document query, const formats::bson::Document& update);
267 ~FindAndModify();
268
269 FindAndModify(const FindAndModify&) = delete;
270 FindAndModify(FindAndModify&&) noexcept;
271 FindAndModify& operator=(const FindAndModify&) = delete;
272 FindAndModify& operator=(FindAndModify&&) noexcept;
273
274 void SetOption(options::ReturnNew);
275 void SetOption(options::Upsert);
276 void SetOption(options::RetryDuplicateKey);
277 void SetOption(const options::Sort&);
278 void SetOption(options::Projection);
279 void SetOption(options::WriteConcern::Level);
280 void SetOption(const options::WriteConcern&);
281 void SetOption(const options::MaxServerTime&);
282 void SetOption(const options::ArrayFilters&);
283
284private:
285 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
286 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
287
288 class Impl;
289 FindAndModify(Impl&&);
290 static constexpr size_t kSize = 80;
291 static constexpr size_t kAlignment = 8;
292 // MAC_COMPAT: std::string size differs
293 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
294};
295
296/// Atomically removes a document and returns it
298public:
299 explicit FindAndRemove(formats::bson::Document query);
300 ~FindAndRemove();
301
302 FindAndRemove(const FindAndRemove&) = delete;
303 FindAndRemove(FindAndRemove&&) noexcept;
304 FindAndRemove& operator=(const FindAndRemove&) = delete;
305 FindAndRemove& operator=(FindAndRemove&&) noexcept;
306
307 void SetOption(const options::Sort&);
308 void SetOption(options::Projection);
309 void SetOption(options::WriteConcern::Level);
310 void SetOption(const options::WriteConcern&);
311 void SetOption(const options::MaxServerTime&);
312
313private:
314 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
315 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
316
317 class Impl;
318 FindAndRemove(Impl&&);
319 static constexpr size_t kSize = 72;
320 static constexpr size_t kAlignment = 8;
321 // MAC_COMPAT: std::string size differs
322 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
323};
324
325/// Runs an aggregation pipeline
327public:
328 explicit Aggregate(formats::bson::Value pipeline);
329 ~Aggregate();
330
331 Aggregate(const Aggregate&);
332 Aggregate(Aggregate&&) noexcept;
333 Aggregate& operator=(const Aggregate&);
334 Aggregate& operator=(Aggregate&&) noexcept;
335
336 void SetOption(const options::ReadPreference&);
337 void SetOption(options::ReadPreference::Mode);
338 void SetOption(options::ReadConcern);
339 void SetOption(const options::WriteConcern&);
340 void SetOption(options::WriteConcern::Level);
341 void SetOption(const options::Hint&);
342 void SetOption(const options::Comment&);
343 void SetOption(const options::MaxServerTime&);
344
345private:
346 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
347 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
348
349 class Impl;
350 static constexpr size_t kSize = 120;
351 static constexpr size_t kAlignment = 8;
352 // MAC_COMPAT: std::string size differs
353 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
354};
355
356/// Retrieves distinct values for a specified field
357class Distinct final {
358public:
359 explicit Distinct(std::string field);
360 Distinct(std::string field, formats::bson::Document filter);
361 ~Distinct();
362
363 Distinct(const Distinct&);
364 Distinct(Distinct&&) noexcept;
365 Distinct& operator=(const Distinct&);
366 Distinct& operator=(Distinct&&) noexcept;
367
368 void SetOption(const options::ReadPreference&);
369 void SetOption(options::ReadPreference::Mode);
370 void SetOption(options::ReadConcern);
371 void SetOption(const options::Collation&);
372 void SetOption(const options::Comment&);
373 void SetOption(const options::MaxServerTime&);
374
375private:
376 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
377 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
378
379 class Impl;
380 static constexpr size_t kSize = 104;
381 static constexpr size_t kAlignment = 8;
382 // MAC_COMPAT: std::string size differs
383 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
384};
385
386class Drop {
387public:
388 Drop();
389 ~Drop();
390
391 Drop(const Drop&);
392 Drop(Drop&&) noexcept;
393 Drop& operator=(const Drop&);
394 Drop& operator=(Drop&&) noexcept;
395
396 void SetOption(const options::WriteConcern&);
397 void SetOption(options::WriteConcern::Level);
398
399private:
400 friend class storages::mongo::impl::cdriver::CDriverCollectionImpl;
401 friend class storages::mongo::impl::cdriver::CDriverTransactionCollectionImpl;
402
403 class Impl;
404 static constexpr size_t kSize = 56;
405 static constexpr size_t kAlignment = 8;
406 // MAC_COMPAT: std::string size differs
407 utils::FastPimpl<Impl, kSize, kAlignment, false> impl_;
408};
409
410} // namespace storages::mongo::operations
411
412USERVER_NAMESPACE_END