2.7使用Groovy查询MongoDB
基于文档或NoSQL数据库的简单性和可扩展性使其非常流行。NoSQL数据库最受欢迎之一是MongoDB(http://www.mongodb.org/)。在该部分,将学习到如何使用Groovy TestStep调用MongoDB的API进行查询。
TIP:MongoDB作为服务端后端
由于MongoDB使用(BinaryJSON)或BSON格式将数据存储为文档。因此在需要JSON数据时,可以方便地将其用作服务或模拟后端。
2.7.1 准备阶段
如果还没有安装MongoDB,可以在MongoDB官网可以找到安装介绍。MongoDB的官网地址:https://docs.mongodb.com/manual/installation/。假设MongoDB运行的服务为localhost、端口为27017。默认情况下,不需要认证; 这将在这部分中被假定。
可以使使用MongoDB的java驱动,连接MongoDB。但是,Groovy用户可以选择GMongo,这很好地简化了API。
GMongo:是标准MongoDB驱动程序的一个方便的Groovy包装器。标准的驱动仍然需要,可以看:https://github.com/poiati/gmongo。在使用GMongo之前,需要下载JAR文件,把JAR文件添加到SoapUI的lib/ext中。可以在Maven中心找到JAR文件:
http://www.java2s.com/Code/Jar/g/Downloadgmongo12sourcesjar.htm。
http://mvnrepository.com/artifact/org.mongodb/mongo-java-driver。
http://mvnrepository.com/artifact/com.gmongo/gmongo。
本章使用版本是:driver:3.2.2,gmongo:1.2;添加jar文件到SoapUI安装路径下的:/bin/ext,本机截图如下:
在原书给出的实例:Chapter2例子中有完整的SoapUI项目:GroovyMongoDB-soapui-project.xml。
关于mongodb的使用教程可以看:http://www.runoob.com/mongodb/mongodb-window-install.html。
2.7.2 操作步骤
我们将使用一个GroovyTestStep调用GMongo API运行例子的查询。首先,使用MongoDB创建一些测试文档,然后我们可以插入一个查询、更新和删除的例子。执行步骤如下:
一、首先,在名为test的数据库中创建几个MongoDB文档。创建一个GroovyTestStep输入如下信息:
代码:
import com.gmongo.GMongo
def mongo = new GMongo()
def db = mongo.getDB('test')
db.invoices << [id: 'inv1', company: 'test company1', amount:'100.00']
db.invoices << [id: 'inv2', company: 'test company2',amount: '200.00']
注意:
在运行脚本之前,创建一个可以连接到本地安装MongoDB的GMongo实例。host=localhost或者127.0.0.1,port=27017。
如果test数据库存在则使用该数据库,不存在则创建test数据库。
插入两个新的invoice文档到新的或者已经存在的集合invoices中。
二、下一步,如何从数据库中查询invoice文档。这里有许多方法操作:
n 创建一个新的GroovyTestStep并添加连接数据库代码,在步骤一有连接数据库的代码
n 这时,连接代码后面添加如下语句:
//获取一条invoice对象
log.info db.invoices.findOne()
n 运行脚本就会看到如下图的输出结果:
三、其他类型的查询语句代码与操作截图如下:
代码:
import com.gmongo.GMongo
def mongo = new GMongo()
def db = mongo.getDB('invoicesDb')
//Get a single invoice object
log.info db.invoices.findOne()
//Get a single invoice document with id=inv2
log.info db.invoices.findOne(id: 'inv3')
//Get a single invoice document, excluding the object id (_id)
db.invoices.findOne([:],[_id: 0])
//To iterate over all invoice documents
db.invoices.find().each{invoice->
log.info invoice
}
四、更新文档的语句及操作截图如下:
代码:
import com.gmongo.GMongo
def mongo = new GMongo()
def db = mongo.getDB('test')
//Get a single invoice document with id=inv2
log.info db.invoices.findOne(id: 'inv2')
//Update invoice object with id=inv2 setting amount=500
db.invoices.update([id: 'inv2'], [$set: [amount: '500']])
//Update invoice object with id=inv2 setting amount=500
db.invoices.update([id: 'inv2'], [$set: [amount: '800',company:"test company"]])
//Get a single invoice document with id=inv2
log.info db.invoices.findOne(id: 'inv2')
五、删除数据的语句及操作截图如下:
代码:
import com.gmongo.GMongo
def mongo = new GMongo()
def db = mongo.getDB('test')
//Get a single invoice document with id=inv1
log.info db.invoices.findOne(id: 'inv3')
//Delete invoice ibject with id=inv1
db.invoices.remove([id: 'inv3'])
//Get All invoices
log.info db.invoices.find([:])
//Delete ALL invoices
db.invoices.remove([:])
//Get All invoices
log.info db.invoices.find([:])
2.7.3 工作原理
这个例子可能很简单以及有限。GMongo封装提供了默认的连接细节以及允许用户只关注查询mongo。这里对于重点和配置很少,没有涉及连接的管理,例如,连接使用后关闭连接。如果需要连接一个不同的服务和端口,使用如下构造器能很容易做到:
defmongo = new GMongo('localhost:27017')
mongo查询语句的使用是相当有趣、有用的。在本章已经告诉如何创建一个数据库与数据集,不用因为通过查询引用他们而大惊小怪。
TIPS: MongoDB语法VS GMongo语法
当查阅MongoDB命令时,GMongo或Groovy需要依据标准MongoDB语法更改Groovy语言,使其与标准MongoDB语法有相同的功能。例如:MongoDB从查血结果中中排除Mongo对象(_id)的命令语法是:db.invoices.findOne({},{_id:0}),但是在使用GMongo时,你需要修改成这样:db.invoices.findOne([:],[_id: 0])。换句话说,MongoDB语法是使用花括号{},GMongo是使用方括号[]。MongoDB使用{}表示空的Map,GMongo或者Groovy使用[:]表示空的Map。
认证
如果你需要认证授权才能连接MongoDB,可以考虑使用GMongo客户端类:com.gmongo.GMongoClient来获取连接。详细信息:https://github.com/poiati/gmongo。
如果想将大量测试数据分别加载到SoapUI的集合中,这时可以查看安装bin目录中的Mongo shell命令mongoimport。
mongoimport:https://docs.mongodb.com/manual/reference/program/mongoimport/。