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>
99 template <
typename... Options>
103 template <
typename... Options>
104 void Drop(Options&&... options);
107 template <
typename... Options>
111 template <
typename... Options>
117 template <
typename... Options>
140 std::shared_ptr<impl::CollectionImpl> impl_;
143template <
typename... Options>
146 (count_op.SetOption(std::forward<Options>(options)), ...);
147 return Execute(count_op);
150template <
typename... Options>
153 (count_approx_op.SetOption(std::forward<Options>(options)), ...);
154 return Execute(count_approx_op);
159template <
typename Option,
typename... Options>
160using HasOptionHelper = std::disjunction<std::is_same<std::decay_t<Options>, Option>...>;
162template <
typename Option,
typename... Options>
163static constexpr bool kHasOption = HasOptionHelper<Option, Options...>::value;
167template <
typename... Options>
170 (find_op.SetOption(std::forward<Options>(options)), ...);
171 return Execute(find_op);
174template <
typename... Options>
177 !(std::is_same<std::decay_t<Options>,
options::
Limit>::value || ...),
"Limit option cannot be used in FindOne"
179 auto cursor = Find(std::move(filter),
options::
Limit{1}, std::forward<Options>(options)...);
180 if (cursor.begin() == cursor.end())
return {};
181 return *cursor.begin();
184template <
typename... Options>
187 (insert_op.SetOption(std::forward<Options>(options)), ...);
188 return Execute(insert_op);
191template <
typename... Options>
194 (insert_op.SetOption(std::forward<Options>(options)), ...);
195 return Execute(insert_op);
198template <
typename... Options>
202 (replace_op.SetOption(std::forward<Options>(options)), ...);
203 return Execute(replace_op);
206template <
typename... Options>
210 (update_op.SetOption(std::forward<Options>(options)), ...);
211 return Execute(update_op);
214template <
typename... Options>
218 (update_op.SetOption(std::forward<Options>(options)), ...);
219 return Execute(update_op);
222template <
typename... Options>
225 (delete_op.SetOption(std::forward<Options>(options)), ...);
226 return Execute(delete_op);
229template <
typename... Options>
232 (delete_op.SetOption(std::forward<Options>(options)), ...);
233 return Execute(delete_op);
236template <
typename... Options>
240 (fam_op.SetOption(std::forward<Options>(options)), ...);
241 return Execute(fam_op);
244template <
typename... Options>
247 (fam_op.SetOption(std::forward<Options>(options)), ...);
248 return Execute(fam_op);
251template <
typename... Options>
254 (drop_op.SetOption(std::forward<Options>(options)), ...);
255 return Execute(drop_op);
258template <
typename... Options>
261 (bulk.SetOption(std::forward<Options>(options)), ...);
265template <
typename... Options>
268 (bulk.SetOption(std::forward<Options>(options)), ...);
272template <
typename... Options>
275 (aggregate.SetOption(std::forward<Options>(options)), ...);
276 return Execute(aggregate);