实验三 MongoDB 数据库操作
【实验目的】:
1. 掌握 MongoDB 数据库的基本概念
2. 掌握 MongoDB 创建数据库
3. 掌握 MongoDB 删除数据库
【实验内容与要求】:
MongoDB 是一个开源文档数据库,提供高性能,高可用性和自动扩展,旨在为 WEB
应用提供可扩展的高性能数据存储解决方案。
MongoDB 中的记录是一个文档,它是由字段和值(key=>value)对组成的数据结构。
MongoDB 文档与 JSON 对象相似。 字段的值可能包括其他文档,数组和文档数组。
在 mongodb 中基本的概念是文档(document)、集合(collection)、数据库(database)。
SQL 术语/概念 MongoDB 术语/概念
解释/说明
database
database
数据库
table
collection
数据库表/集合
row
document
数据记录行/文档
column
field
数据字段/域
index
index
索引
table joins
表连接,MongoDB 不支持
primary key
primary key
主键,MongoDB 自动将_id 字段
设置为主键
例如:
启动集群服务:
master 节点 1——192.168.226.132:《大数据存储与处理》实验指导书
mongod -f /home/app/mongodb/master.conf
slave1 节点 2——192.168.226.130:
mongod -f /home/app/mongodb/slave1.conf
arbiter 节点 3——192.168.226.131:
mongod -f /home/app/mongodb/arbiter.conf
执行 mongo 192.168.226.132 命令进入 mongodb shell
关闭 mongodb 务必使用关闭服务命令:
master 节点 1——192.168.226.132:
mongod --journal --shutdown -f /home/app/mongodb/master.conf
slave1 节点 2——192.168.226.130:
mongod --journal --shutdown -f /home/app/mongodb/slave1.conf
arbiter 节点 3——192.168.226.131:
mongod --journal --shutdown -f /home/app/mongodb/arbiter.conf
题目 0:进入 mongodb shell
执行 mongo 192.168.226.132 命令进入 mongodb shell(注意这里 mongod 的服务已经启
动)
题目一:MongoDB 创建数据库
MongoDB 创建数据库的语法格式如下:
use “DATABASE_NAME”
如果数据库不存在,则创建数据库,否则切换到指定数据库。
例如:以下示例创建了数据库use Employee:
- 25 -《大数据存储与处理》实验指导书
如果想查看所有数据库,可以使用 show dbs 命令:
可以看到,刚创建的数据库 Employee 并不在数据库的列表中, 要显示它,需要向
Employee 数据库插入一些数据。
MongoDB 中默认的数据库为 test,如果没有创建新的数据库,集合将存放在 test 数据
库中。
题目二:MongoDB 删除数据库
MongoDB 删除数据库的语法格式如下:
db.dropDatabase()
删除当前数据库,默认为 test,可以使用 db 命令查看当前数据库名。
首先,使用 show dbs 查看所有数据库,然后用 use 切换到数据库 Employee,再进行删
除操作,最后使用 show 查看数据库是否删除成功,操作步骤如图所示:
题目三:集合操作
1. 创建集合的方法
命令格式:db.createCollection(name, options)
例如在 myDB 数据库下创建 myCollection 集合,
执行以下命令:
db.createCollection("myCollection")
查询数据库中所有的集合使用 show collections,
对集合重命名使用 renameCollection 方法,如下图所示:
删除集合使用 drop 方法,参考上图。
相关操作:
(1)插入数据
db.myColl.insert({'username':'zhangyu','age':13,'salary':500});
db.myColl.insert({'username':'zhangyu','age':13,'salary':500});
db.myColl.insert({'username':'laohu','age':20,'salary':200});
db.myColl.insert({'username':'banma','age':13,'salary':300});
db.myColl.insert({'username':'xiongmao','age':8,'salary':300});
(
2)统计集合中数据条数。
db.myColl.count()
(
3)查询第一条数据。
db.myColl.findOne()
注意,findOne 中的 O 要大写。
(
4)查询第 1 条以后的所有数据。
db. myColl.find().skip(1)
(
5)跳过第 2 条,查询后两条数据。
db. myColl.find().limit(2).skip(2)
(
6)限定查询 3 条数据。
db. myColl.find().limit(3)
(
7)查询结果集的记录数。(查询 salary 小于 300 或大于 400 的个数)
db. myColl.find({$or:[{salary:{$lt:300}},{salary:{$gt:400}}]}).count()
(8)查询指定列的数据。可以通过 find(或者 findOne)的第二个参数来指定想要的键,
这样做既会节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。
查询 myColl 集合中,'age'列和'salary'列。
db.mycollection.find({},{age:1,salary:1})
1 表示显示此列的意思,也可以用 true 表示。
(9)按 salary 升序排序。(将 1 换成-1 就是降序排序)
db. myColl.find().sort({salary:1})
(10)查询 username 列,并去掉重复数据。
db. myColl.distinct('username')
(11)查询 age 等于 13 的数据。
db. myColl.find({'age':13})
(12)查询 age 小于 13 的数据。
db. myColl.find({age:{$lt:13}})
(13)查询 age 大于 15 的数据。
db. myColl.find({age:{$gt:15}})
(14)查询 age 不等于 13 的数据。
db. myColl.find({'age':{$ne:13}})
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开。语法格式如下:
db.col.find({key1:value1, key2:value2})
(15)查询 age 等于 20,salary 等于 200 的数据。
db. myColl.find({'age':20,'salary':200})
(16)查询 age 小于 13,salary 大于等于 200 的数据。
db. myColl.find({$and:[{age:{$lt:13}},{salary:{$gte:200}}]})
(17)MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } )
(18)查询 salary 大于 300 或 age 小于等于 13 的数据。
db. myColl.find({$or:[{salary:{$gt:300}},{age:{$lte:13}}]})
(19)AND 和 OR 联合使用。
查询 salary 大于等于 300 时,username 为'banma'或者 age 为 8 的数据,类似的常规 SQL
语句为:where salary>=300 and (username = 'banma' or age = 8)
db. myColl.find({'salary': {$gte:300}, $or: [{'username': 'banma'},{'age': 8}]})
(
20)ongoDB $type 操作符
$type 操作符是基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。
MongoDB 中可以使用的类型如下表所示:
获取 myColl 集合中 username 为 String 类型的数据。
(
21)MongoDB 正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
查询 username 中包含‘m’的数据。
db. myColl.find({username:/m/})
(
22)查询以 z 开头的数据。
题目四 使用游标和 printjson 输出 testdb 数据库 c3 集合中所有结果集。
var cursor = db.c3.find()
while(cursor.hasNext()){printjson(cursor.next())}
题目五 MongoDB python 编程。
(1) python 编程访问 MongoDB 中的 mytest 数据库,判断集合 employs 是否
存在,如果 employs 存在,输出“集合已存在!”,否则输出“集合不存在!”
import pymongo
myclient = pymongo.MongoClient('mongodb://192.168.126.140:27017/')
mydb = myclient["testdb"]
collist = mydb.list_collection_names()
if "employs" in collist:
print("集合已存在!")
else:
print("集合不存在!")
(2)Python 编程修改 testdb 数据库中 sales 集合中“_id”为 3 的文档中 price 键
的值修改为 20,并打印出该条文档。
import pymongo
myclient = pymongo.MongoClient("mongodb://192.168.126.140:27017/")
mydb = myclient["testdb"]
mycol = mydb["sales"]
myquery = { "_id": 3 }
newvalues = { "$set": { "price": 20 } }
mycol.update_one(myquery, newvalues)
for x in mycol.find({"_id":3}):
print(x)
思考题:MongoDB 集群安装模式有哪些?各有什么特点?
小结
掌握 MongoDB 数据库的基本概念,掌握 MongoDB 创建数据库,掌握 MongoDB 删除
数据库。