gpt4 book ai didi

c++ - 移动复制和/或分配一个 mongodb cxx 游标

转载 作者:可可西里 更新时间:2023-11-01 10:14:18 30 4
gpt4 key购买 nike

我正在编写一系列围绕 mongodb-cxx 类的类,以便使它们符合我用 Qt 编写的应用程序其余部分的存储 API。

我不需要 Mongo 的完整功能集,基本上只是 CRUD:创建、读取、更新、删除和查找,也许还需要传入一些更高级的参数(读/写问题等)。

我曾想围绕 mongocxx::cursor 创建一个包装器类,以便 find() 的结果可以“稍后”以存储 API 使用的数据格式进行迭代。 “稍后”是指(包装的)游标返回到一个抽象类,该抽象类可以迭代结果并根据模式验证数据,或者可以跳过条目,或者可以将结果分组(异步)发送到结束客户端等

例如,如果我有:(为了这个例子稍微缩写了一点)

using namespace mongocxx;

class QMongoClient
{
static instance _instance;

QMongoClient(QString url) : _client( uri( qPrintable(url) ) );
client _client;
QMongoDatabase operator[](QString d);
};

class QMongoDatabase
{
QMongoDatabase(database db) : _database(db);
database _database;
QMongoCollection operator [](QString c);
};

class QMongoCollection
{
QMongoCollection(collection c) : _collection(c);
collection _collection;
//create... same as insert()
//read... same as find_one()
//update... same as upsert() or update()
//delete...
//find... a query will be provided
QMongoCursor findAll() { cursor c = _collection.find({}); return QMongoCursor(c); };
};

class QMongoCursor
{
QMongoCursor(cursor c) : _cursor(c);
//copy/move/assign constructors needed, probably

cursor _cursor;

QString data(); //return document contents as JSON string, for instance

//begin() <-- iterator
//end() <-- iterator
};

我曾希望这个方法能起作用,而且它确实起作用了,直到游标抛出编译器错误:

error: call to implicitly-deleted copy constructor of 'mongocxx::v_noabi::cursor'

这个想法是做这样的事情:

QMongoClient client("mongodb://url...");
QMongoDatabase db = client["somedbname"];
QMongoCollection coll = db["somecollection"];
QMongoCursor c = coll.findAll();

//or more abbreviated:
QMongoCursor c = client["somedbname"]["somecollection"].findAll();

//iterate over c here as needed, or send it to another abstraction layer...

我认为发生这种情况是因为 mongocxx::cursor 对象不应该被传递,当它们超出范围时就会被销毁。

例如,当 QMongoCursor::findAll() 完成时,返回的游标将被销毁,并且不能在 QMongoCursor 构造函数中复制。

findAll() 函数在那一刻检索所有文档并返回它们(结果集的大小可能未知)似乎非常低效。例如,我希望能够一次检索 10 个结果,然后通过网络将它们异步分组发送到最终客户端。

所以问题是:

  • 如果游标在超出范围且没有复制/移动构造函数时被销毁,我如何保持游标存活
  • 或者我怎样才能创建一个指向游标的指针并知道它的生命周期是多少以及何时删除它
  • 是否还有其他我缺少的方法?我一直在查看文档,但没有找到。

我想我缺少一些 C++ 语法或机制,例如移动分配或类似的东西。

有什么想法吗?

最佳答案

好吧,mongocxx::cursor 对象 可移动的,但您没有要求移动它,您要求的是一个拷贝。尝试:

QMongoCursor(cursor c) : _cursor(std::move(c));

您可能也想为您的 QDatabase 和 QCollection 构造函数执行此操作。

你还应该考虑的一件事是,如果你正在构建更高级别的工具包,你需要密切注意与clientdatabasecollectioncursor 对象。您可能会发现构建类似 shared_ptr 的抽象以确保类型系统强制执行正确的生命周期对您的用例是有利的。

我们没有让驱动程序以这种方式工作,因为我们不想将这个决定强加给人们。相反,我们认为它可以而且应该委托(delegate)给更高级别的抽象,可能就像您正在构建的那样。

关于c++ - 移动复制和/或分配一个 mongodb cxx 游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46586854/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com