stdx::optional<result::insert_one> collection::insert_one(view_or_value document, const options::insert& options) { class bulk_write bulk_op(false); bsoncxx::document::element oid{}; bsoncxx::builder::stream::document new_document; if (!document.view()["_id"]) { new_document << "_id" << bsoncxx::oid(bsoncxx::oid::init_tag); new_document << concatenate(document); bulk_op.append(model::insert_one(new_document.view())); oid = new_document.view()["_id"]; } else { bulk_op.append(model::insert_one(document)); oid = document.view()["_id"]; } if (options.write_concern()) { bulk_op.write_concern(*options.write_concern()); } if (options.bypass_document_validation()) { bulk_op.bypass_document_validation(*options.bypass_document_validation()); } auto result = bulk_write(bulk_op); if (!result) { return stdx::optional<result::insert_one>(); } return stdx::optional<result::insert_one>( result::insert_one(std::move(result.value()), std::move(oid.get_value()))); }
stdx::optional<result::insert_one> collection::insert_one(view_or_value document, const options::insert& options) { // TODO: We should consider making it possible to convert from an options::insert into // an options::bulk_write at the type level, removing the need to re-iterate this code // many times here and below. // // See comments in: https://github.com/mongodb/mongo-cxx-driver/pull/409 options::bulk_write bulk_opts; bulk_opts.ordered(false); if (options.write_concern()) { bulk_opts.write_concern(*options.write_concern()); } if (options.bypass_document_validation()) { bulk_opts.bypass_document_validation(*options.bypass_document_validation()); } class bulk_write bulk_op(bulk_opts); bsoncxx::document::element oid{}; bsoncxx::builder::basic::document new_document; if (!document.view()["_id"]) { new_document.append(kvp("_id", bsoncxx::oid())); new_document.append(concatenate(document)); bulk_op.append(model::insert_one(new_document.view())); oid = new_document.view()["_id"]; } else { bulk_op.append(model::insert_one(document)); oid = document.view()["_id"]; } auto result = bulk_write(bulk_op); if (!result) { return stdx::nullopt; } return stdx::optional<result::insert_one>( result::insert_one(std::move(result.value()), std::move(oid.get_value()))); }