一、MongoDB介绍
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
层级关系:db -> collection -> document.
二、MongoDB的基础
本文使用Linux系统操作MongoDB,MongoDB已安装好,安装和启动就不在赘述。
(一)、进入和退出MongoDB
输入命令 mongo 即可进入系统,显示如下:
-
vip@Vip:~$ mongo
-
MongoDB shell version: 2.6.10
-
connecting to: test
-
Server has startup warnings:
-
2018-07-10T13:19:03.789+0800 [initandlisten]
-
2018-07-10T13:19:03.789+0800 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.
-
2018-07-10T13:19:03.789+0800 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal).
-
2018-07-10T13:19:03.789+0800 [initandlisten] ** See http://dochub.mongodb.org/core/32bit
-
2018-07-10T13:19:03.789+0800 [initandlisten]
退出输入 exit 即可。
(二)、数据库db操作
(1)数据库的创建和查看
输入命令 use database_name 即可创建数据库,查看所有数据库,可以使用 show dbs 命令,注意如果该数据库中没有集合则该数据库不会显示在界面中,输入命令 db 可以查看当前库。
-
> show dbs
-
amdin 0.078GB
-
local 0.078GB
-
> use moyu
-
switched to db moyu
-
> show dbs
-
amdin 0.078GB
-
local 0.078GB
-
> db.createCollection('user')
-
{ "ok" : 1 }
-
> show dbs
-
amdin 0.078GB
-
local 0.078GB
-
moyu 0.078GB
-
> db
-
moyu
(2)数据库的删除
首先切换到要删除的数据库 use db ,使用db.dropDatabase() 即可删除。
-
> show dbs
-
amdin 0.078GB
-
local 0.078GB
-
moyu 0.078GB
-
> use moyu
-
switched to db moyu
-
> db.dropDatabase()
-
{ "dropped" : "moyu", "ok" : 1 }
-
> show dbs
-
amdin 0.078GB
-
local 0.078GB
(三)、管理集合
管理集合有:查看当前数据库的集合 show collections 、集合的创建 db.createCollection(name, options) 、删除集合 db.集合名称.drop() 。
-
> use moyu
-
switched to db moyu
-
> db.createCollection('user')
-
{ "ok" : 1 }
-
> show collections
-
system.indexes
-
user
-
> db.user.drop()
-
true
-
> show collections
-
system.indexes
参数说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
使用如下:
-
> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000})
-
{ "ok" : 1 }
-
> show collections
-
mycol
-
system.indexes
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
(四)、文档操作
(1)、插入文档
db.集合名称.insert(document),每一条数据,就是一个document。插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId。
-
> db.user.insert([{name:'moyu',age:20,gender:'male'},{name:'liyi',age:29,gender:'famle'}])
-
BulkWriteResult({
-
"writeErrors" : [ ],
-
"writeConcernErrors" : [ ],
-
"nInserted" : 2,
-
"nUpserted" : 0,
-
"nMatched" : 0,
-
"nModified" : 0,
-
"nRemoved" : 0,
-
"upserted" : [ ]
-
})
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }
-
> db.user.insert({_id:2018,name:'gogo',age:55})
-
WriteResult({ "nInserted" : 1 })
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }
-
{ "_id" : 2018, "name" : "gogo", "age" : 55 }
-
> db.user.find({_id:2018})
-
{ "_id" : 2018, "name" : "gogo", "age" : 55 }
这样查询的数据是不是很不美观么,没关系我们加一个pretty,自己动手实验一下吧~ db.user.find().pretty()
(2)、更新文档
使用update() 方法用于更新已存在的文档,格式如下:
-
db.collection.update(
-
<query>,
-
<update>,
-
{
-
upsert: <boolean>,
-
multi: <boolean>,
-
writeConcern: <document>
-
}
-
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
-
> db.user.update({'_id':2018},{$set:{'name':'changed'}})
-
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
-
> db.user.find({_id:2018}).pretty()
-
{ "_id" : 2018, "name" : "changed", "age" : 55 }
-
> db.user.find().pretty()
-
{
-
"_id" : ObjectId("5b45f69dec125c1d1dab60d3"),
-
"name" : "moyu",
-
"age" : 20,
-
"gender" : "male"
-
}
-
{
-
"_id" : ObjectId("5b45f69dec125c1d1dab60d4"),
-
"name" : "liyi",
-
"age" : 29,
-
"gender" : "famle"
-
}
-
{ "_id" : 2018, "name" : "changed", "age" : 55 }
-
>
注意:
①如果此处未使用操作符$set 则会对此条文档进行了一个覆盖。
-
> db.user.update({'_id':2018},{'name':'changed'})
-
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
-
> db.user.find({'_id':2018}).pretty()
-
{ "_id" : 2018, "name" : "changed" }
②查询条件query查到多条时会只更新第一条文档,要更新多条需要添加 { multi: ture },并且使用操作符$set指定更新的字段。
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }
-
{ "_id" : 2018, "name" : "changed" }
-
{ "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }
-
> db.user.update({'name':'liyi'},{$set:{'age':25}})
-
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }
-
{ "_id" : 2018, "name" : "changed" }
-
{ "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }
-
{ "_id" : 2018, "name" : "changed" }
-
{ "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }
-
> db.user.update({'name':'liyi'},{$set:{'age':25}},{multi:true})
-
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })
-
> db.user.find()
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }
-
{ "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }
-
{ "_id" : 2018, "name" : "changed" }
-
{ "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 25 }
(3)、删除文档
使用remove() 方法的基本语法格式如下所示:
-
db.collection.remove(
-
<query>,
-
{
-
justOne: <boolean>,
-
writeConcern: <document>
-
}
-
)
参数说明:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
- writeConcern :(可选)抛出异常的级别。
-
> db.user.remove({'age':25},{justOne:true})
-
WriteResult({ "nRemoved" : 1 })
三、使用Python操作MongoDB
环境:
Python:3.5 IDE:pycharm 系统:Ubuntu
自行安装pymongo(pip install pymongo)
-
import pymongo
-
# 连接到MongoDB ip地址+端口号
-
client = pymongo.MongoClient('127.0.0.1',27017)
-
#指定数据库
-
db = client['moyu']
-
#指定集合
-
info = db['info']
-
#插入一条文档
-
doc_one = {'name':'woo', 'age':33, 'gender':'male'}
-
info.insert_one(doc_one)
-
#插入多条文档
-
doc_many = [{'name':'woo', 'age':33, 'gender':'male'},{'name':'hello', 'age':44, 'gender':'female'}]
-
info.insert_many(doc_many)
-
#更新 name是woo 的name 为changed
-
#同样的也是只更新第一条文档
-
info.update({'name':'woo'},{'$set':{'name':'changed'}})
-
#更新多条
-
info.update({'name':'woo'},{'$set':{'name':'changed'}},{'multi':'true'})
-
#删除一条文档,多条去掉justOne
-
info.remove({'name':'woo'},{'justOne':'true'})
-
#集合查询
-
data = info.find({'name':'woo'})
-
for item in data:
-
print(item)