MongoDB 是由C++语言编写的,是一个基于分布式文件存储面向文档存储的开源数据库系统。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
这里贴一个Mac安装的方式MongoDB
安装完启动server可能会报错像MongoDB: exception in initAndListen: 20 Attempted to create a lock file on a read-only directory: /d
通过sudo chown -R $USER /data/db
修改权限即可。
/usr/local/mongdb/bin/mongod -port 10001 --dbpath /data/mongodb/ --logpath /var/mongodb/mongodb.log
,关于启动的具体参数可以查看MongoDB的启动与停止,写的挺详细。
还可以将相关参数配置成配置文件
vim mongodb.conf
port=10001 #代表端口号,如果不指定则默认为 27017
dbpath= /data/mongodb/ # 数据库路径
logpath= /data/mongodb/ #日志路径
logappend=true #日志文件自动累加,而不是覆盖
启动命令: /usr/loca/mongodb/bin/mongod -f mongodb.conf
启动后可能会报错Access control is not enabled for the database
,这里我们添加一个用户即可,见下方连接与登录参考。
查询端口来验证是否启动netstat -lanp | grep "27017"
参考
启动的log可以参考
第一次启动可以使用mongo
启动后,添加启动账号密码:
添加完后,重启数据库服务,带–auth参数启动:
mongod --dbpath=/home/mongodb/dbfile/data_file/ --logpath=/home/mongodb/dbfile/log_file --auth --fork;
这样就会开启安全检查。服务器启动完后。在用mongo连接,然后用db,auth(“name”, “pass”)函数来登录。这样才有操作的权限。
mongo -u "kg" -p "123" --authenticationDatabase "kgraph"
,因为要切换的用户可能在当前数据库没有权限,而切换过后就会出现上述错误。如果已经用mongo登录到数据库了,可以使用"ctrl+c"来退出mongo客户端(服务器不会关闭),
查看数据库show dbs
选择或创建数据库use DATABASE_NAME
查看集合show tables/collections
删除数据库db.dropDatabase()
创建集合db.createCollection(name, options)
db.createCollection("name", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
删除集合db.collection.drop()
插入文档,mongo自动创建集合db.col.insertOne({"name" : "基础学习"})
,这里创建了col
的集合
向集合插入多条数据 db.collection.insertMany()
查找集合 db.col.find()
删除文档db.inventory.deleteOne( { status: "D" } )
和db.inventory.deleteMany({})
集合查看db.col.find()
和db.col.find().pretty()
# pretty
以格式化的方式显示所有文档
指定读取的记录数db.COLLECTION_NAME.find().limit(NUMBER)
跳过指定数量的数据db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
更新集合db.collection.update()
例如db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
以上详细的可以查看菜鸟教程
And db.col.find({key1:value1, key2:value2}).pretty()
Or db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
等于 {
小于 {
小于等于 {
大于 {
大于等于 {
不等于 {
具体查看菜鸟教程
MongoDB可以使用的类型:
获取"col"集合中title为String的数据db.col.find({"title" : {$type : 2}})
db.col.find({"title" : {$type : 'string'}})
db.COLLECTION_NAME.find().sort({KEY:1})
注意:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。
Python操作与终端数据库操作类似。
本文引用自
推荐一篇不错的文章
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
conn = MongoClient('172.16.16.97', 27017)
mydb = conn['hadoop']
dblist = conn.list_database_names() #列出db name
mycol = mydb.list_collection_names() #列出col name
mydb = myclient["db_name"]
mycol = mydb["col_name"]
mydict = { "name": "mongo", "type": "database"}
x = mycol.insert_one(mydict)
print(x)
<pymongo.results.InsertOneResult object at 0x7f93fad94988>
#如果我们在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id。
print(x.inserted_id)
5d64d1397b4237fc223a2982
x = mycol.find_one()
{'_id': ObjectId('5d5e025165fa335687a18690'), 'name': 'aaa'}
for x in mycol.find():#相当于find_all()
print(x)
#“_id”的值为1表示显示id,如果不想显示可设为0,当有一个0,其他都自动设为1
mycol.find_one({},{"_id":1,"name":1})
{'_id': ObjectId('5d5e025165fa335687a18690'), 'name': 'aaa'}
指定查询条件
myquery = { "name": "Google" }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
{'_id': 2, 'name': 'Google', 'address': 'Google 搜索'}
查询"name"首字母大于"H"
myquery = { "name": { "$gt": "W" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
{'_id': ObjectId('5d5e025165fa335687a18690'), 'name': 'aaa'}
{'_id': ObjectId('5d64d1397b4237fc223a2982'), 'name': 'mongo', 'type': 'database'}
{'_id': 5, 'name': 'Zhihu', 'address': '知乎'}
利用正则表达式查询字符串
查询"name"首字母为"R"的内容
myquery = { "name": { "$regex": "^R" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
{'_id': 1, 'name': 'RUNOOB', 'cn_name': '菜鸟教程'}
返回指定条数的数据
myresult = mycol.find().limit(5)
for x in myresult:
print(x)
myquery = { "cn_name": "菜鸟教程" }
newvalues = { "$set": { "cn_name": "菜鸟养成" } }
mycol.update_one(myquery, newvalues)
for x in mycol.find({"name":"RUNOOB"}):
print(x)
{'_id': 1, 'name': 'RUNOOB', 'cn_name': '菜鸟养成'}
update_one() 方法只能修匹配到的第一条记录,如果要修改所有匹配到的记录,可以使用 update_many()
myquery = { "name": { "$regex": "^R" } }
newvalues = { "$set": { "alexa": "123" } }
x = mycol.update_many(myquery, newvalues)
print(x.modified_count, "文档已修改")
1 文档已修改
mydoc = mycol.find().sort("alexa",-1)#-1表示对字段 alexa 按降序排序:
for x in mydoc:
print(x)
delete_one和delete_many
myquery = { "name": "RUNOOB" }
mycol.delete_one(myquery)
#删除后输出
for x in mycol.find().limit(5):
print(x)
myquery = { "name": {"$regex": "^F"} }
x = mycol.delete_many(myquery)
print(x.deleted_count, "个文档已删除")
删除集合mycol.drop()
GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),适合于不常改变但是经常需要连续访问的大文件。pymongo 利用gridfs构建大文件存储系统
import os
import sys
from gridfs import *
from pymongo import MongoClient
from datetime import datetime
from bson import binary
#连接数据库
client = MongoClient("localhost:27017",username="kg",password="123",authSource="kgraph")
#定义上传和下载的文件夹
up_path = "/Users/enjlife/Desktop/cv/"
do_path = "/Users/enjlife/Desktop/temp/"
#使用Gridfs获取数据库集合
db = client.kgraph
mycol = db.list_collection_names() # 查看集合列表
fs = GridFS(db, collection='pdfs')
#定义上传和下载函数
#批量上传 Gridfs
def gd_upload(fs,up_path):
for filename in os.listdir(up_path):
dic = {}
dic["fname"] = filename
# dic["上传时间"] = datetime.now()
content = open(up_path + filename,"rb").read()
fs.put(content,**dic)
def gd_download(fs,do_path):
for cursor in fs.find():
name = cursor.fname
content = cursor.read()
with open(do_path + name,"wb") as f:
f.write(content)
mycol = db.list_collection_names() # 查看集合列表,Gridfs会分两部分上传
#['pdfs', 'pdfs.files', 'pdfs.chunks']
#查看结果
col = db.pdfs.files
for x in col.find():
print(x)
接上面连接数据库获取的col
col = db.pdfs
def bs_upload(col,uppath):
dic = {}
dic["fname"] = "FastR-CNN.pdf"
data = open(up_path + "FastR-CNN.pdf","rb").read()
if not col.find_one({"fname":"FastR-CNN.pdf"}):
dic["bdata"] = binary.Binary(data)
col.insert(dic)
python利用mongodb上传图片数据 : GridFS 与 bson两种方式
python下上传/下载各种格式文件到MongoDB数据库中
未完待续…