12#include <userver/formats/bson/document.hpp>
13#include <userver/formats/bson/value.hpp>
14#include <userver/storages/mongo/bulk.hpp>
15#include <userver/storages/mongo/cursor.hpp>
16#include <userver/storages/mongo/operations.hpp>
17#include <userver/storages/mongo/write_result.hpp>
19USERVER_NAMESPACE_BEGIN
21namespace storages::mongo {
38 explicit Collection(std::shared_ptr<impl::CollectionImpl>);
44 template <
typename... Options>
49 template <
typename... Options>
53 template <
typename... Options>
57 template <
typename... Options>
61 template <
typename... Options>
65 template <
typename... Options>
70 template <
typename... Options>
75 template <
typename... Options>
80 template <
typename... Options>
84 template <
typename... Options>
88 template <
typename... Options>
94 template <
typename... Options>
102 template <
typename... Options>
106 template <
typename... Options>
107 void Drop(Options&&... options);
110 template <
typename... Options>
114 template <
typename... Options>
120 template <
typename... Options>
126 template <
typename... Options>
127 std::vector<formats::
bson::
Value>
Distinct(std::string field, Options&&... options)
const;
133 template <
typename... Options>
158 std::shared_ptr<impl::CollectionImpl> impl_;
161template <
typename... Options>
164 (count_op.SetOption(std::forward<Options>(options)), ...);
165 return Execute(count_op);
168template <
typename... Options>
171 (count_approx_op.SetOption(std::forward<Options>(options)), ...);
172 return Execute(count_approx_op);
177template <
typename Option,
typename... Options>
178using HasOptionHelper = std::disjunction<std::is_same<std::decay_t<Options>, Option>...>;
180template <
typename Option,
typename... Options>
181static constexpr bool kHasOption = HasOptionHelper<Option, Options...>::value;
185template <
typename... Options>
188 (find_op.SetOption(std::forward<Options>(options)), ...);
189 return Execute(find_op);
192template <
typename... Options>
195 !(std::is_same<std::decay_t<Options>,
options::
Limit>::value || ...),
196 "Limit option cannot be used in FindOne"
198 auto cursor = Find(std::move(filter),
options::
Limit{1}, std::forward<Options>(options)...);
199 if (cursor.begin() == cursor.end()) {
202 return *cursor.begin();
205template <
typename... Options>
208 (insert_op.SetOption(std::forward<Options>(options)), ...);
209 return Execute(insert_op);
212template <
typename... Options>
215 (insert_op.SetOption(std::forward<Options>(options)), ...);
216 return Execute(insert_op);
219template <
typename... Options>
226 (replace_op.SetOption(std::forward<Options>(options)), ...);
227 return Execute(replace_op);
230template <
typename... Options>
237 (update_op.SetOption(std::forward<Options>(options)), ...);
238 return Execute(update_op);
241template <
typename... Options>
248 (update_op.SetOption(std::forward<Options>(options)), ...);
249 return Execute(update_op);
252template <
typename... Options>
255 (delete_op.SetOption(std::forward<Options>(options)), ...);
256 return Execute(delete_op);
259template <
typename... Options>
262 (delete_op.SetOption(std::forward<Options>(options)), ...);
263 return Execute(delete_op);
266template <
typename... Options>
273 (fam_op.SetOption(std::forward<Options>(options)), ...);
274 return Execute(fam_op);
277template <
typename... Options>
280 (fam_op.SetOption(std::forward<Options>(options)), ...);
281 return Execute(fam_op);
284template <
typename... Options>
287 (drop_op.SetOption(std::forward<Options>(options)), ...);
288 return Execute(drop_op);
291template <
typename... Options>
294 (bulk.SetOption(std::forward<Options>(options)), ...);
298template <
typename... Options>
301 (bulk.SetOption(std::forward<Options>(options)), ...);
305template <
typename... Options>
308 (aggregate.SetOption(std::forward<Options>(options)), ...);
309 return Execute(aggregate);
312template <
typename... Options>
314 operations::Distinct distinct_op(std::move(field));
315 (distinct_op.SetOption(std::forward<Options>(options)), ...);
316 return Execute(distinct_op);
319template <
typename... Options>
325 operations::Distinct distinct_op(std::move(field), std::move(filter));
326 (distinct_op.SetOption(std::forward<Options>(options)), ...);
327 return Execute(distinct_op);