当前位置 博文首页 > weixin_41997073的博客:【星海出品】Mongodb快速入门
MongoDB
是一个基于分布式文件存储的非关系型数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
文档是MongoDB的核心概念。文档就是键值对的一个有序集{‘msg’:‘hello’,‘foo’:3}。类似于python中的有序字典
架构简单 没有复杂的连接
深度查询能力,MongoDB支持动态查询。
容易调试 容易扩展
不需要转化/映射应用对象到数据库对象
使用内部内存作为存储工作区,以便更快的存取数据。
安装
https://www.mongodb.com/download-center/community
windows下载官方zip,解压即可使用。
组件 | 文件名称 |
---|---|
server | mongod.exe |
router | mongos.exe |
client | mongo.exe |
MonitoringTools | mongostat.exe,mongotop.exe |
ImportExportTools | mongodump.exe, mongorestore.exe, mongoexport.exe, mongoimport.exe |
MiscellaneousTools | bsondump.exe, mongo?les.exe, mongooplog.exe, mongoperf.exe |
运行
$ cd /o/mongodb3.6/bin
$./mongod.exe
MongoDB服务端可运行在Linux、Windows或mac os
x平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
MongoDB是一个有趣设计的数据库。适于存储JSON等类文档数据。还提供了分片功能 在全栈 Javascript 开发架构,使用
MongoDB,Express,React,Node。具有 React
组件的热加载、模块化文件结构等特性。简称为MERN。其中M就是指的MongoDB
MERN开发建构 https://www.oschina.net/p/mern
mongodb配置使用YAML格式
嵌套使用缩进完成,不支持Tab等制表符,支持空格 冒号后要有空格
Yaml参考https://www.w3cschool.cn/iqmrhf/dotvpozt.html
配置http://mongoing.com/docs/reference/con?guration-options.html
systemLog
destination, #缺省是输出日志到std,?le表示输出到文件
path, #日志路径
logAppend,true #表示在已存在的日志文件追加。默认false,每次启动服务,重新创建新的日志。
storage
dbPath, #必须指定,mongodb的数据目录
net
bindIp, #缺省绑定到127.0.0.1
port, #端口,缺省为27017,客户端连接用
windows下 mongodb需要激活,命令如下
$ mongod.exe -f “o:/mongodb3.6/bin/mongod.yml” --serviceName mongod --serviceDisplayName mongo --install
linux基础操作
登入数据库
[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
普通配置文件
cd /application/mongodb/conf/
[mongod@MongoDB conf]$ vim mongod1.conf
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1
使用配置文件开启和关闭
启动:mongod -f mongod1.conf
关闭:mongod -f mongod1.conf --shutdown
在数据库中关闭的方法
shell > mongo
[mongod@MongoDB conf]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
> use admin
> db.shutdownServer()
server should be down...
数据库中的基础操作可以查看
https://www.cnblogs.com/clsn/p/8214194.html
python开发对接
Pycharm插件 在settings/plugins中输入mongo,安装Mongo Plugin,完成后重启Pycharm。
菜单项View/Tool Windows/Mongo Explorer
Mongodb官方推荐使用pymongo。参看https://docs.mongodb.com/ecosystem/drivers/pymongo/
本次Mongodb使用的是3.6,需要pymongo 3.6以上。缺省安装pymongo 3.8,目前兼容Python 3.4+。
mongodb的连接字符串 mongodb://wayne:wayne@127.0.0.1:27017/test
from pymongo import MongoClient
#client = MongoClient(host='127.0.0.1', port=27017) #客户端连接
client = MongoClient('mongodb://127.0.0.1:27017')
print(client)
#db = client.blog
db = client['blog']#指定数据库
print(db)
#users = db['users']
users = db.users#集合
print(users)
# MongoDB中可以创建使用多个库,但有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
con?g:当Mongo用于分片设置时,con?g数据库在内部使用,用于保存分片的相关信息。
插入数据
from pymongo.results import InsertOneResult
user1 = {'id':'1','name':'ben','age':20}
#单条插入
x:InsertOneResult = users.insert_one(user1)
print(type(x),x)
print(x.inserted_id) # 5d45546f42a331914ccaaf06
user2 = {'id':257,'name':'tom','age':32}
user3 = {'id':258,'name':'jerry','age':48}
#批量插入
result = users.insert_many([user2,user3])
print(result.inserted_ids)
# [ObjectId('5d4557be12f2bf1448c743de'),
# ObjectId('5d4557be12f2bf1448c743df')]
#大小写敏感
user4 = {'id':'3','name':'tom','age':20,'Name':'tommy'}
x = users.insert_one(user4)
print(x.inserted_id)
import datetime
t ='5d45546f42a331914ccaaf06'[:8]#时间戳提取
print(t)
x = int.from_bytes(bytes.fromhex(t),'big')
print(hex(x),x)
print(datetime.datetime.fromtimestamp(x))
import bson
print(bson.ObjectId('5d45546f42a331914ccaaf06').generation_time)
# 每一条记录对应一个文档,其格式使用BSON。BSON即Binary JSON。
每条数据插入后都有一个唯一key,属性 id 唯一标识一个文档。没有没有显式指明该属性,会自动生成一个ObjectId类型的 id 属性
mongodb支持的操作符
https://www.runoob.com/mongodb/mongodb-operators.html
查询
注: 使用db.collection.createIndex()在集合中创建一个索引,可以提高效率
索引用于高效的执行查询,没有索引的MongoDB将扫描整个集合中的所有文档,这种扫描效率很低,需要处理大量
的数据.
索引是一种特殊的数据结构,将一小块数据集合保存为容易遍历的形式.索引能够存储某种特殊字段或字段集的
值,并按照索引指定的方式将字段值进行排序.
#查询
result = users.find_one({'name':'tom'})
print(type(result),result)#返回字典带oid
#使用key查询
from bson.objectid import ObjectId
result = users.find_one({'_id':ObjectId('5d48d95d4fd47046028b8e54')})
print(type(result),result)
#查不到,返回None
result = users.find_one({'name':'tommy'})
print(type(result),result)#返回字典带oid
查询操作
可以使用任何常用查询操作符 $gt,$lt,$in等
count = users.find({'age':{'$gt':20}}).count()
print(count)
排序
results = users.find().sort('name',pymongo.DESCENDING)
print(*list(results),sep='\n')
print('-'*30)
results = users.find().sort([
('name',pymongo.DESCENDING),
('age',pymongo.ASCENDING)
])
print(*list(results),sep='\n')
分页
分片是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加 以及读写操作的要求。
results =users.find()
print(*list(results),sep='\n')
print('-'*30)
results = users.find().skip(2)
print(*list(results),sep='\n')
print('-'*30)
results = users.find().skip(1).limit(2)
print(*list(results),sep='\n')
print('-'*30)
更新
#多行更新
result = users.update_many({'name':'tom'}, {'$set':{'gender':'M'}})
print(type(result), result)
print(result.matched_count, result.modified_count)
print(*list(users.find({'name':'tom'})), sep='\n') #全部更新
#replaceOne更新一个文档
#更新除_id字段外的所有字段
result = users.replace_one({'name':'tom'},
{'id':200,'name':'sam'})
print(type(result),result)
print(*list(users.find()),sep='\n')
删除
#删除
from pymongo.results import DeleteResult
result:DeleteResult = users.delete_one({'Name':'tommy'})
print(type(result),result.deleted_count)
result = users.delete_many({'name':{'$exists':True}})
print(type(result), result.deleted_count)
print(*list(users.find()),sep='\n')
print('-'*30)
db.collection.delete_many({})删除所有文档,慎用
cs