Mongodb

Mongodb

本地客戶端Robo 3T

installation
  1. 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
  1. 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

  1. 數據庫存儲位置
    dbPath
    更新后記得修改文件權限(可以mongod --dbpath xxx來創建配置文件)
  2. 外部ip訪問
    bindIp
  3. 登錄驗證
    先登錄
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

  1. 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
  1. 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 ,
}}
]);

  1. Count
col.find().count()
  1. Insert
item = {
    "url": url,
    "html": html
}
items = [item1, item2, item3...]

col.insert_one(item)
col.insert_many(items)
  1. 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)
  1. CreateIndex
創建索引
col.create_index("url", unique=True)
  1. Delete
col.remove({"city": "xxx"})

dump&restore

一開始搞了個服務器裝上mongo用來存負責系統的行為日志, 隨著公司的發展速度硬盤離裝滿越來越近了, 行為日志變得越來越重要, 對容災性, 查詢性能都開始有了要求, 于是在tencent買了mongo服務, 需要遷移一波數據.
其實也沒多大, 7,8個g, 寫個腳本循環一遍也是ok的, 但是總覺得那么做有點傻.
于是就開始折騰備份.

  1. 先用現成的
    其實騰訊云有mongo遷移服務的, 但是遷移起來并沒成功, 提了個工單, 人家表示你的是4.0, 我們的是3.2, 不向下兼容
  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版本里執行.
  3. tips
    ps: tencent還有個坑, dbname不能有中劃線 han-dev ==> han_dev
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。