实验三?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?删除?
数据库。