我很困惑,在online doc,的代码片段中,它显示了调用update_many方法时finalize的用法,如下所示:
mongocxx::stdx::optional<mongocxx::result::update> result =
collection.update_many(
document{} << "i" << open_document <<
"$lt" << 100 << close_document << finalize,
document{} << "$inc" << open_document <<
"i" << 100 << close_document << finalize);
但是我已经看到mongocxx驱动程序代码中的示例代码没有finalize
// Update multiple documents.
{
// @begin: cpp-update-multiple-documents
bsoncxx::builder::stream::document filter_builder, update_builder;
filter_builder << "address.zipcode"
<< "10016"
<< "cuisine"
<< "Other";
update_builder << "$set" << open_document << "cuisine"
<< "Category To Be Determined" << close_document << "$currentDate"
<< open_document << "lastModified" << true << close_document;
db["restaurants"].update_many(filter_builder.view(), update_builder.view());
// @end: cpp-update-multiple-documents
}
那么使用finalize或不使用它有什么区别?如何做出选择?
答案 0 :(得分:1)
要理解两个构造之间的区别,我们需要通过深入了解{{3}中的源代码和Owning BSON Documents (values)页面来理解Non-owning BSON Documents (views)和Working with BSON document之间的区别。 }。
拥有BSON文档哪个类型为documentation表示拥有其数据缓冲区的文档,因此当值超出范围时,将释放其缓冲区。如果您不熟悉,可以了解bsoncxx::document::value
甚至scope here。
finalize
从临时缓冲区返回类型为bsoncxx::document::value
的BSON文档。因此finalize
会返回拥有的BSON文档。
另一方面,非拥有BSON文件是better here的实例;查看拥有的BSON文档。如文档中所述,
在性能关键代码中,传递视图比使用值更可取,因为我们可以避免过多的复制。此外,传递文档视图允许我们多次使用该文档。
同样在bsoncxx::document::view
中明确提到的一个例子
document::values
必须比使用它们的任何document::views
更长久。如果底层值被清除,视图将留下一个悬空指针。