Ubuntu 安装 MongoDB( 含 pymongo 连接封装代码 )

Ubuntu 安装 MongoDB( 含 pymongo 连接封装代码 )

1 环境准备

下载: https://www.mongodb.com/download-center#community

tar -zxvf mongodb-linux-x86_64-ubuntu1404-3.4.10.tgz
sudo mv mongodb-linux-x86_64-ubuntu1404-3.4.10  /usr/local/mongodb # 将解压包拷贝到指定目

MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:

export PATH=/usr/local/mongodb/bin:$PATH

2 创建数据库目录

MongoDB 的数据存储在 data 目录的 db 目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在 data 目录中创建 db 目录。

注意:/data/db 是 MongoDB 默认的启动的数据库路径( –dbpath )

sudo mkdir -p /data/db

如果使用非 root 用户启动可能会出现以下错误:

2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] MongoDB starting : pid=19584 port=27017 dbpath=/data/db 64-bit host=shuzilm
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] db version v3.4.10
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] git version: 078f28920cb24de0dd479b5ea6c66c644f6326e9
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.1f 6 Jan 2014
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] modules: none
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] build environment:
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten]     distmod: ubuntu1404
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten]     distarch: x86_64
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten]     target_arch: x86_64
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] options: {}
2017-11-27T14:44:23.989+0800 I STORAGE  [initandlisten] exception in initAndListen: 20 Attempted to create a lock file on a read-only directory: /data/db, terminating
2017-11-27T14:44:23.989+0800 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2017-11-27T14:44:23.989+0800 I NETWORK  [initandlisten] shutdown: going to flush diaglog...
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] now exiting
2017-11-27T14:44:23.989+0800 I CONTROL  [initandlisten] shutting down with code:100

解决方法:


> cd /data
> ls -ltr
drwxr-xr-x  2 root root 4096 1127 14:44 db/

> sudo chown owen db
>ls -ltr 
drwxr-xr-x  2 owen root 4096 1127 14:44 db/

3 运行 MongoDB 服务:

你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。

注意:如果你的数据库目录不是/data/db,可以通过 –dbpath 来指定。

> cd /usr/local/mongodb/bin
> ./mongod

4 运行 MongoDB Shell

MongoDB Shell 是 MongoDB 自带的交互式 Javascript shell,用来对 MongoDB 进行操作和管理的交互式环境。

当你进入 mongoDB 后台后,它默认会链接到 test 文档(数据库):

> cd /usr/local/mongodb/bin
> ./mongo

由于它是一个 JavaScript shell,您可以运行一些简单的算术运算:

> 2+2
4
4.1 创建管理员用户

用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用 db.auth(username, password) 方法登录。

创建了一个名为 root 的用户管理员,用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中创建。下面是一个例子:

> show dbs
admin  0.000GB
local  0.000GB
> use admin
switched to db admin
> db.test.findOne()
null
> db.test.insert({"wode":"enen nide"})
WriteResult({ "nInserted" : 1 })
> db.test.find()
{ "_id" : ObjectId("5a1bbc7ec443c81b33aaf520"), "wode" : "enen nide" }
> db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }

创建完了这个用户之后,我们应该马上以该用户的身份登录:

> db.auth("root","root123")
1

db.auth() 方法返回 1 表示登录成功。接下来我们为指定的数据库创建访问所需的账号。

4.2 启动认证
> ./mongod --auth

登录 MongoDB Shell,提示未认证

> ./mongo
MongoDB shell version v3.4.10
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.10
> show dbs
2017-11-27T15:28:53.022+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
    "code" : 13,
    "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1

用户认证,并通过认证,有权限

> use admin
switched to db admin
> db.auth('root','root123')
1
> show dbs
admin  0.000GB
local  0.000GB
4.3 创建数据库

use DataBaseName

> use awd_id_log
switched to db awd_id_log

如果你想查看所有数据库,可以使用 show dbs 命令:

> show dbs
admin  0.000GB
local  0.000GB

可以看到,我们刚创建的数据库 awd_id_log 并不在数据库的列表中,要显示它,我们需要向 awd_id_log 数据库插入一些数据。

向新建数据库插入数据:

> use admin
switched to db admin
> db.auth("root","root123")
1
> use awd_id_log
switched to db awd_id_log
> db.test_coll.insert({"test_record":"test"})
WriteResult({
    "writeError" : {
        "code" : 13,
        "errmsg" : "not authorized on awd_id_log to execute command { insert: \"test_coll\", documents: [ { _id: ObjectId('5a1bc96855f136e37456a038'), test_record: \"test\" } ], ordered: true }"
    }
})

插入失败,因为 root 用户没有对 awd_id_log 的写权限。

创建库用户:

> use admin
switched to db admin
> db.auth("root","root123")
1
> use awd_id_log
switched to db awd_id_log
> db.createUser({user:"liujx",pwd:"123456",roles:["dbAdmin","readWrite"]})
Successfully added user: { "user" : "liujx", "roles" : [ "dbAdmin", "readWrite" ] }
> db.auth("liujx","123456")
1
> db.test_coll.insert({"test_record":"test"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin       0.000GB
awd_id_log  0.000GB
local       0.000GB
> db.test_coll.find()
{ "_id" : ObjectId("5a1bcb8955f136e37456a039"), "test_record" : "test" }

插入数据成功,并查询到数据。

5 Python 连接 MongoDB

mongo_config.json

{
    "mongo_conf":
    {
        "host":"localhost",
        "port":"27017",
        "user":"owen",
        "pwd":"123456",
        "db":"awd_id_log"
    }
}

mongodb.py

import time
# from urllib import parse
from pymongo import MongoClient

class MyMongoDB:

  def __init__( self, mongo_config ):

    self.__connect = None
    self.__mongo_config = mongo_config
    self.__reconnect()

  def __connect_mongo( self, mongo_config ):

    host = mongo_config["host"]
    port = mongo_config["port"]
    user = mongo_config["user"]
    pwd = mongo_config["pwd"]
    db_name = mongo_config["db"]

    # 1. URI 连接 MongoDB 方式
    # uri = "mongodb://{}:{}@{}:{}/{}".format( parse.quote_plus( user ), parse.quote_plus( pwd ), host, port, db_name )
    # client = MongoClient( uri )
    # db_handler = client[db_name]

    # 2. 认证连接 MongoDB 方式
    client = MongoClient( host, int( port ) )
    db_handler = client[db_name]
    # 授权. 这里的 user 基于数据库名为 db_name 的库授权
    db_handler.authenticate( user, pwd )

    return db_handler

  def __reconnect( self ):

    try:
      self.__connect = self.__connect_mongo( self.__mongo_config )
      return self.__connect
    except Exception as ex:
      assert(False)

    return None

  def get_db_connect( self ):

    if( self.__connect ):
      return self.__connect
    else:
      return self.__reconnect()

    return self.__reconnect()

  def get_collection( self, coll_name ):
    coll_handler = None

    if( self.__connect ):
      coll_handler = self.__connect[coll_name]
    else:
      coll_handler = None

    return coll_handler

if __name__ == "__main__":

  import json
  config_file = "mongo_config.json"

  with open( config_file, "r") as fp:

    config_json = json.load( fp )

    mongo_conf = config_json["mongo_conf"]

    mongo_db = MyMongoDB( mongo_conf )

    table = mongo_db.get_collection( "test_coll" )

    # 1. 插入
    table.insert_one( {"beijing":"tiananmen"} ) # 插入一条
    table.insert_many( [ {"woai":"beijingtianmen"}, {"tianmenshang":"taiyangsheng"} ] )

    # 2. 删除
    table.delete_one({}) # 无条件删除一条
    table.delete_one( {"beijing":"tiananmen"} ) # 删除一条符合条件的记录
    table.delete_many( {"beijing":"tiananmen"} ) # 删除所有符合条件的记录

    # 3. 查询
    ret = table.find_one({"woai":"beijingtianmen"}) # 条件查询一条符合条件的记录
    ret = table.find({}) # 无条件查询所有
    ret = table.find({"woai":"beijingtianmen"}) # 条件查询所有符合条件的记录

    # 结果以列表打印
    print( list( ret ) )

    # 逐个遍历结果集打印
    for record in ret:
      print( record )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值