Mongodb
本地客户端Robo 3T
installation
- create file
Centos:
vim /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
- install
sudo yum install -y mongodb-org
或者指定版本
sudo yum install -y mongodb-org-4.0.0 mongodb-org-server-4.0.0 mongodb-org-shell-4.0.0 mongodb-org-mongos-4.0.0 mongodb-org-tools-4.0.0
配置
vim /etc/mongod.conf
- 数据库存储位置
dbPath
更新后记得修改文件权限(可以mongod --dbpath xxx
来创建配置文件) - 外部ip访问
bindIp
- 登录验证
先登录
mongo -u username -p "passwd" --authenticationDatabase admin
or
mongo 127.0.0.1:27017/admin -u username
创建密码:
use admin;
db.createUser({ user: "useradmin", pwd: "adminpassword", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
db.auth(username, password)验证是否创建成功
再修改配置
security:
authorization: enabled(注意缩进)
新建db后增加用户
use yourdatabase
db.createUser({ user: "youruser", pwd: "yourpassword", roles: [{ role: "dbOwner", db: "yourdatabase" }] })
shell登录
mongo 127.0.0.1:27017/admin -u username
Pymongo
- Connect
1.1 no password
import pymongo
client = pymongo.MongoClient("ip", port)
db = client.dbname
col = db.collection_name
1.2 password
import pymongo
client_url = "mongodb://username:password@ip:port/db"
client = pymongo.MongoClient(cli_url)
db = client.dbname
col = db.collection_name
- Select
1. all
col.find()
2. part
col.find({"xx":xx})
col.find_one({"xx": xx})
3. regex
col.find({"passed": 1, 'raw_summary_url': {"$regex": 'http://esf\..*'}})
4. exists
col.find({'raw_url': {'$exists': False}})
5. or
items = col.find({"pid": 127201, "$or": [{"name": "sku_lock"}, {"name": "sku_unlock"}]})
6. time filter
db.getCollection('logs').find({"updated": {"$gte": "2018-09-09 12:00:00", "$lt": "2018-09-10 12:00:00"}}).count()
7. aggregate
7.1 group
db.getCollection('logs').aggregate(
[
{$match: {updated: {$gte: "2018-09-09 12:00:00", $lt: "2018-09-10 12:00:00"}}},
{$group: {_id:'$user', co: {$sum: 1}}},
{$sort: {co: -1}}
])
7.2 字段显示
db.getCollection('logs').aggregate([
{ $project : {
user : 1 ,
name : 1 ,
}}
]);
- Count
col.find().count()
- Insert
item = {
"url": url,
"html": html
}
items = [item1, item2, item3...]
col.insert_one(item)
col.insert_many(items)
- Update
item = {
"new_url": url,
"new_html": html
}
如果Mongo没有则忽视
col.update_one({"a": a}, {"$set": item}})
如果Mongo没有则插入
col.update_one({"a": a}, {"$set": item}}, upsert=True)
- CreateIndex
创建索引
col.create_index("url", unique=True)
- Delete
col.remove({"city": "xxx"})
dump&restore
一开始搞了个服务器装上mongo用来存负责系统的行为日志, 随着公司的发展速度硬盘离装满越来越近了, 行为日志变得越来越重要, 对容灾性, 查询性能都开始有了要求, 于是在tencent买了mongo服务, 需要迁移一波数据.
其实也没多大, 7,8个g, 写个脚本循环一遍也是ok的, 但是总觉得那么做有点傻.
于是就开始折腾备份.
- 先用现成的
其实腾讯云有mongo迁移服务的, 但是迁移起来并没成功, 提了个工单, 人家表示你的是4.0, 我们的是3.2, 不向下兼容 - emmmm, 那就只能自己试了
网上搜一搜, dump命令:
mongodump -h host --port port -u user -p password -d db -o /home/manbug/testmongo(file path) --authenticationDatabase admin
然后不出所料开始了报错的历程
报错报的浅显易懂, 就是说你验证没成功啥的. 搜起来也没搜到啥, 大多都是提示--authenticationDatabase admin
这个一定要带上哦, 如果你导出的数据库有密码的话.
终于在我反复换了几次admin账户, 数据库账户并一位一位确认密码没错之后, 我决定把这句删了, 然后...离成功近了一步
所以最后其实是mongodump -h host --port port -u user -p password -d db -o /home/manbug/testmongo(file path)
, 当然此时还是报了个错, 说什么snap不识别.
最后发现这个原因是因为我本地是3.6, 服务器是4.0, 所以无法dump, 去服务器上dump然后本地scp拷贝下来, 又试了下restore
mongorestore -h 127.0.0.1:27017 -d han_dev --dir testmongo/han-dev (--authenticationDatabase admin 3.2需要这句)
成功, 看来3.6存4.0的还是可以存, 只是dump时需要在原4.0版本里执行. - tips
ps: tencent还有个坑, dbname不能有中划线han-dev==> han_dev