访问MongoDB

MongoDB是一个开源的文档存储数据库. 它是NoSql体系中的一个.

在关系型数据库中管理数据, 你必须先定义一个表(架构), 但是在MongoDb中将不再需要做这些. 在MongoDB中, 数据是通过一种叫做”文档(Documents)”的类似于JSON格式(BSON)进行存储的, 数据集(set)通过”集合(Collection)”管理. 在系统中, 每一个文档(document)分配一个唯一的ID(ObjectID).

这里是关系型数据库和MongoDB分层结构的对比:

MongoDB 关系型数据库 说明
Database Database 术语一样
Collection Table  
Document Record  


安装

使用下面的命令重新安装框架:

$ tar xvzf treefrog-x.x.x.tar.gz
$ cd treefrog-x.x.x
$ ./configure --enable-mongo
$ cd src
$ make
$ sudo make install
$ cd ../tools
$ make
$ sudo make install

-x.x.x表示当前下载的版本.

关键设置

假设MongoDB已经被安装并且服务器已经在运行. 然后你可以使用生成器生成应用的框架.

为了和MongoDB服务器通讯, 让我们设置连接信息. 首先, 编辑config/application.ini的这一行.

MongoDbSettingsFile=mongodb.ini

然后编辑config/mongodb.ini, 指定主机名和数据库名. 像SQL数据库的配置文件一样, 配置文件的内容分成3节, dev, test,和product.

[dev]
DatabaseName=foodb        # 数据库名
HostName=192.168.x.x      # 主机名或者IP地址
Port=
UserName=
Password=
ConnectOptions=           # unused

现在, 在MongoDB运行的情况下, 让我们在应用程序根目录先执行下面的命令来检查设置.

$ tspawn --show-collections
DatabaseName: foodb
HostName:     localhost
MongoDB opened successfully
-----------------
Existing collections:

如果成功了, 将会显示上面的内容.

网页应用可以同时访问MongoDB和SQL数据库. 这样能够使网页应用在系统复杂增加的情况下灵活响应.

新建文档

要访问MongoDB服务器, 使用TmongoQuery对象. 指定集合名称为构建器的参数来创建实例.

MongoDB文档用QVariantMap对象来表示. 设置对象的键值对, 然后用insert()方法插入到MongoDB的尾部.

#include <TMongoQuery>
--- 
TMongoQuery mongo("blog");  // 对blog集合进行操作
QVariantMap doc;

doc["title"] = "Hello";
doc["body"] = "Hello world.";
mongo.insert(doc);   // 插入新文档

在内部, 当insert()方法被调用时,分配了一个唯一的ObjectID.

补充

从这个例子中可以看到, 开发者不需要关心连接/断开MongoDB, 因为连接管理是框架自己来处理的. 通过复用连接的机制, 连接/端口的数量可以保存在少量.

读取文档(Document)

当你搜索文档时, 并且有符合设置条件时, 必须一个一个地将返回的文档传递到一个QVariantMap中. 请小心, 这里必须使用QVariantMap, 因为查询条件也表示为QVariantMap.

下面的例子创建了一个包含两个查询条件的Criteria对象, 然后作为find()方法的参数被传递. 假设这里有不知道一个i文档符合查询条件, 我们使用while语句循环列出可用的文档(documents).

TMongoQuery mongo("blog");
QVariantMap criteria;

criteria["title"] = "foo";  // 设置查询条件
criteria["body"] = "bar";  // 设置查询条件

mongo.find(criteria);    // 执行查询
while( mongo. next()){
    QVariantMap doc = mongo.value(); // 获得一个文档
    // 处理过程
}
  • 两个查询条件被AND操作符连接起来.

如果你仅仅查找一个符合条件的文档, 你可以使用findOne()方法.

QVariantMap doc = mongo.findOne(criteria);

这下面的例子设置’num’的查询条件. 只有符合’num’的值大于10的文档才匹配. 为了实现它, 使用$gt作为查询条件对象的比较运算符.

QVariantMap criteria;
QVariantMap gt;
gt.insert("$gt", 10);
criteria.insert("num", gt);   // 设置查询条件
mongo.find(criteria); // 执行查询
   :

比较运算符:

  • $gt: 大于
  • $gte: 大于等于
  • $lt: 小于
  • $lte: 小于等于
  • $ne: 不等于
  • $in: 在结果中
  • $nin: 不再结果中

OR运算符

使用逻辑运算符OR $or 操作符连接查询条件

QVariantMap criteria;
QVariantList orlst;
orlst << c1 << c2 << c3;  // 3个查询条件
criteria.insert("$or", orlst);
   :

如上所述, TmongoQuery的查询条件是用一个那个QVariantMap类型的对象表示的. 在MongoDB中, 查询条件用JSON表示, 所以当执行一条查询时, QvariantMap对象会被转换成JSON对象. 因此你可以指定所有MongoDB支持的操作符(这些操作符已经根据它们的规则被进行了正确的描述). 有效的查询然后就变的可能了.

MongoDB还提供了更多的运算符. 要更深入的了解请查看MongoDB文档.

更新文档

我们将从MongoDB服务器读取一个文档然后更新它. 如update()方法所示, 我们将更新匹配匹配的文档.

TMongoQuery mongo("blog");
QVariantMap criteria;
criteria["title"] = "foo"; // 设置查询条件
QVariantMap doc = findOne(criteria);   // 获得一个文档
doc["body"] = "bar baz";               // 更改文档的内容

criteria["_id"] = doc["_id"];          // 设置ObjectID为查询条件
mongo.update(criteria, doc);

这里有非常重要的地方需要注意, 如果有几个文档匹配查询条件, 为了确保文档被更新, 增加ObjectID到查询条件.

此外, 如果你像更新匹配查询条件的所有文档, 你可以使用updateMulti()方法.

mongo.updateMulti(criteria, doc);

删除文档

如果想删除一个文档, 定义对象的ID作为条件.

criteria["_id"] = "517b4909c6efa89aed288706";  // 根据ObjectID删除对象
mongo.remove(criteria);

你还可以删除所有匹配的文档.

TMongoQuery mongo("blog");
QVariantMap criteria;
criteria["foo"] = "bar";
mongo.remove(criteria);    // 删除