mongodb
----------------------------------------------------------
1.安装
新建 /etc/yum.repos.d/mongodb.repo,内容为
[mongodb-org]
name=MongoDB Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el$releasever/
gpgcheck=0
enabled=1
执行
sudo yum makecache
sudo yum install mongodb-org
-----------------------------------------------------
2.启动
mongodb 配置文件 /etc/mongod.conf
可以将在后台运行
mongod -fork -f /etc/mongod.conf
提示:Failed to connect to:192.168.0.104:27017: Connection refused。
解决:
进入mongodb安装目录的bin目录,新增mongodb.conf文件,输入
bind_ip=0.0.0.0
在重新启动即可
mongodb 的数据目录 dbpath : /var/lib/mongodb/
----------------------------------------------
3.安装启动后在后台登录
/run/mongodb
路径下 bin
cd bin
./mongo #执行后进入到后台
----------------------------------------------
4.mongodb中 database 数据库,collection 数据库表或集合 ,document 为数据记录行或文档,field 为数据字段或域
index为索引 ,primary key 主键 自动将_id字段作为主键
注:不支持表连接
----------------------------------------------
5.
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs" 命令可以显示所有数据的列表。
#show dbs;
admin 从权限角度 讲,类似root数据库,讲一个用户添加到这个数据库,用户自动集成所有数据库的权限。一些特定服务器端命令也只能从这个库上运行
config 当mongo用于分片设置时,config在内部使用,用于保存分片的相关信息
local 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
test
执行db命令,可以显示当前数据库对象或集合
#db
test 默认连接test
#use local 指定连接到local库 和mysql类似,这一点
数据库名小写,最多64字节
文档document是键值对 key-value
-------------------------------------------------
6.创建数据库实例
以下实例我们创建了数据库 runoob:
use runoob
db
show dbs 如果看不到runoob ,可以先向其中插入一条数据后再看
db.runoob.insert({"name":"du"})
show
------------------------
#删除数据库
db.dropDatabase()
-------------------------
#创建集合
db.createCollection("runoob")
----------------------
#显示
show collections
----------------------
#删除集合 mycol2
db.mycol2.drop()
---------------------------------------
#插入文档,更新文档,删除文档,查询文档
insert()或save()方法向集合中插入文档
db.collection_name.insert(document) 如果插入的数据主键已经存在,会抛异常,提示主键重复,不保存
db.collection_name.save(document) 如果主键存在则更新数据,如果不存在就插入数据
runoob为集合的名字,如果该集合不在数据库中,mongodb会自动创建该集合并插入文档
db.runoob.insert({title:'mongodb',description:'nosql',by:'菜鸟教程',url:'http://www.runoob.com',tags:['mongodb','database','nosql']})
-------------------
db.runoob.find()
也可以将数据定义为一个变量
document = {title:'',description:'',tags:['','','']}
----------------------
updata 更新文档
db.collection_name.update(query,update,{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
})
query :update的查询条件 where 后面的
update : 类似set后面的
upsert: 可选,如果不存在update记录,是否插入objNew,true 为插入,默认为false
multi:可选,默认是false,只更新第一条记录,如果为true,则更新所有查询的数据
writeConcern,可选,抛出的异常的级别
-------------------
db.runoob.update({'title':'mongodb'},{$set:{'title':'MongoDB数据库'}})
可以看到匹配的条数,是否插入记录,修改的条数
-----------------
db.runoob.find()
db.runoob.find().pretty()
-----------------------------------------------------
删除文档
db.collection.remove(query,{justOne,writeConcern})
db.runoob.remove({'title':'123'}) 已过时
remove不会史芳空间,需要 db.repairDatabase()来回收磁盘空间
db.col.remove({})清空所有文档
推荐使用
deleteOne() deleteMany()
---------------------------------------------------
查询文档
db.collection.find(query,projection)
使用易读的方式来读取数据
db.col.find().pretty()
db.col.findOne()只返回一个文档
db.col.find({"by":"菜鸟教程"}).pretty()
db.col.find({"likes":{$lt:50}}).pretty()
db.col.find({"likes":{$lte:50}}).pretty()
db.col.find({"likes":{$gte:50}}).pretty()
db.col.find({"likes":{$ne:50}}).pretty()
------------------------------------------------------
AND条件
db.col.find({key1:value1, key2:value2}).pretty()
OR条件
db.col.find({$or:[{key1:value1},{key2:value2}]})
AND OR联合使用
db.col.find({'likes':{$gt:50}, $or: [{'':''},{'':''}]}).pretty()
---------------------------------------------------
条件操作符
大于 $gt
小于 $lt
大于等于 $gte
小于等于 $lte
db.runoob.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb'],
likes: 100
})
db.col.find({likes : {$lt : 150}})
db.col.find({likes : {$lt :200, $gt : 100}})
-------------------------------------------------
$type 查询某一列,类型为对应类型的数据
如String 对应2
db.runoob.find({'title':{$type:2}})
db.runoob.find({'title':{$type : 'string'}})
------------------------------------------------
读取指定数量的记录
limit(number)
db.runoob.find().limit(2)
------------------------------------------------
skip()跳过指定数量的数据
db.runoob.find().limit(1).skip(1) ,取第二条文档
------------------------------------------------
排序:
sort({key:1}) ,1升序,-1 降序
db.runoob.find().sort({'likes':-1})
----------------------------------------------
创建索引
db.collection.createIndex(keys,options)
db.col.createIndex({'title':1}) 1 升序,-1降序
-----------------------------------------------------
聚合
aggregate(),主要处理数据(诸如统计平均值,求和等,并返回数据计算后的结果)
????
https://www.runoob.com/mongodb/mongodb-sharding.html
-----------------------------------------------------------------------------------
7.python 安装MongoDB功能模块
pip3 install pymongo
pip3 install pymongo
-----------------------------------------------------------------------------------
使用
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://10.8.32.79:27017/")
#mydb = myclient["runoob"]
dblist = myclient.list_database_names()
# dblist = myclient.database_names()
if "runoob" in dblist:
print("数据库已存在!")
mydb = myclient["runoob"]
collection = mydb["runoob"]
datas = collection.find()
for data in datas:
#print(data)
#print(data.get('titles'))
-----------------------------------------------------------------------------
创建一个集合
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"] #数据库
mycol = mydb["sites"] #集合
-------------------------------------------------------------------------------
判断集合是否已经存在
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient('mongodb://localhost:27017/')
mydb = myclient['runoobdb']
collist = mydb. list_collection_names()
# collist = mydb.collection_names()
if "sites" in collist: # 判断 sites 集合是否存在
print("集合已存在!")
------------------------------------------------------------------------------
插入一个文档
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mydict = { "name": "RUNOOB", "alexa": "10000", "url": "https://www.runoob.com" }
x = mycol.insert_one(mydict)
print(x)
print(x)
---------------------------------------------------------------------------------
插入多个文档
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mylist = [
{ "name": "Taobao", "alexa": "100", "url": "https://www.taobao.com" },
{ "name": "QQ", "alexa": "101", "url": "https://www.qq.com" },
{ "name": "Facebook", "alexa": "10", "url": "https://www.facebook.com" },
{ "name": "知乎", "alexa": "103", "url": "https://www.zhihu.com" },
{ "name": "Github", "alexa": "109", "url": "https://www.github.com" }
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
-------------------------------------------------------------------------------
插入指定id的多个文档
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["site2"]
mylist = [
{ "_id": 1, "name": "RUNOOB", "cn_name": "菜鸟教程"},
{ "_id": 2, "name": "Google", "address": "Google 搜索"},
{ "_id": 3, "name": "Facebook", "address": "脸书"},
{ "_id": 4, "name": "Taobao", "address": "淘宝"},
{ "_id": 5, "name": "Zhihu", "address": "知乎"}
]
x = mycol.insert_many(mylist)
# 输出插入的所有文档对应的 _id 值
print(x.inserted_ids)
----------------------------------------------------------------------
查找一条数据:
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
x = mycol.find_one()
print(x)
----------------------------------------------------------------------
查找集合中所有数据
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find():
print(x)
-------------------------------------------------------------------
使用 find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "_id": 0, "name": 1, "alexa": 1 }):
print(x)
0 不返回,1返回
---------------------------------------------------------------------
以下实例除了 alexa 字段外,其他都返回;同时指定了 0 和 1 则会报错
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
for x in mycol.find({},{ "alexa": 0 }):
print(x)
---------------------------------------------------------------------
指定条件查询
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": "RUNOOB" }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
-----------------------------------------------------------------------
实例用于读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": { "$gt": "H" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
--------------------------------------------------------------
以下实例用于读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^R"} :
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^R" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
-------------------------------------------------------
实例返回 3 条文档记录
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myresult = mycol.find().limit(3)
# 输出结果
for x in myresult:
print(x)
-------------------------------------------------
以下实例将查找所有以 F 开头的 name 字段,并将匹配到所有记录的 alexa 字段修改为 123
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": { "$regex": "^F" } }
newvalues = { "$set": { "alexa": "123" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")
-----------------------------------------
排序:升序
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mydoc = mycol.find().sort("alexa")
for x in mydoc:
print(x)
------------------------------------
---降序
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mydoc = mycol.find().sort("alexa", -1)
for x in mydoc:
print(x)
---------------------------
实例删除 name 字段值为 "Taobao" 的文档:
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": "Taobao" }
mycol.delete_one(myquery)
# 删除后输出
for x in mycol.find():
print(x)
----------------------------------------
删除多个文档,删除所有 name 字段中以 F 开头的文档:
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
myquery = { "name": {"$regex": "^F"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")
----------------------------------------------
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档:
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
x = mycol.delete_many({})
print(x.deleted_count, "个文档已删除")
-----------------------------------------------
删除集合
#!/usr/bin/python3
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["runoobdb"]
mycol = mydb["sites"]
mycol.drop()
-------------------------------------------------
参考:
https://mirror.tuna.tsinghua.edu.cn/help/mongodb/