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