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

你可能感兴趣的:(Mongodb)