5

我很困惑,在在线文档的代码片段中,它显示了调用 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驱动程序代码中看到了示例代码

  // 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 和不使用它有什么区别呢?如何做出选择?

4

1 回答 1

1

要了解这两种构造之间的区别,我们需要通过深入研究源代码和文档中的使用 BSON 文档页面来了解拥有 BSON文档(值)非拥有 BSON 文档(视图)之间的区别。

拥有 BSON 文档的类型bsoncxx::document::value代表那些拥有其数据缓冲区的文档,因此当 超出范围时,他的缓冲区被释放。您可以在这里了解范围,如果对您来说是新的,甚至可以在这里更好地了解它。

finalizebsoncxx::document::value从临时缓冲区返回 BSON 类型的文档。所以finalize返回一个Owning BSON Document

另一方面,非拥有 BSON 文档bsoncxx::document::view; 拥有 BSON 文档的视图。如文档中所述,

在性能关键代码中,传递视图比使用值更可取,因为我们可以避免过度复制。此外,传递一个文档的视图允许我们多次使用该文档。

同样在BSON 文档生命周期中明确提到了一个例子

任何使用它们的人都必须document::values活得更久。document::views如果底层值被清理,视图将留下一个悬空指针。

于 2016-11-24T19:18:47.177 回答