本文最后更新于:3 years ago

安装MongoDB

这里只介绍用docker安装MongoDB并用navicat远程连接

安装镜像

docker pull mongo:latest

运行容器

docker run -itd --name mongo -p 27017:27017 mongo --auth

设置服务器的端口防火墙

添加安全规则,打开27017端口

创建用户

使用MongoDB自带的admin数据库创建用户

$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')

更改mongod.cnf.orig配置文件

进入MongoDB容器

docker exec -it mongo /bin/bash

安装vim

  1. apt-get update
  2. apt-get install vim

修改配置文件

进入/etcvim mongod.cnf.orig打开文件修改以下内容

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 

security:
  authorization: 'enabled'

重启MongoDB容器

docker restart mongo

接着就可以远程使用navicat连接了,用刚刚创建的用户,数据库写admin

Python使用MongoDB

安装pymongo

pip install pymongo

连接

import pymongo
client = pymongo.MongoClient('mongodb://用户名:密码@ip:27017/')
db = client.test #连接test数据库 等价于 client['test']
collection = db.students #stdents表 等价于 db['students']
result = collection.insert_one({'id':'200','name':'orange','age':20})
print(result) #有结果证明连接成功

插入数据

import pymongo
client = pymongo.MongoClient('mongodb://用户名:密码@ip:27017/')
db = client.test #连接test数据库 等价于 client['test']
collection = db.students #stdents表 等价于 db['students']
#插入单个数据
result = collection.insert_one({'id':'200','name':'orange','age':20})
#插入多个数据
result2 = collection.insert_many([{'id':'200','name':'orange','age':20},{'id':'200','name':'orange','age':21}])

查询数据

import pymongo
client = pymongo.MongoClient('mongodb://用户名:密码@ip:27017/')
db = client.test #连接test数据库 等价于 client['test']
collection = db.students #stdents表 等价于 db['students']

#查询所有name是wyc的
result = collection.find({'name':'wyc'})
#查询一条数据
result = collection.find_one({'name':'wyc'})
#按条件查询
result = collection.find({'age':{'$lt':20}}) #查询年龄小于20的数据
#计数
result = collection.find({'name':'wyc'}).count()
#排序
result = collection.find({'name':'wyc'}).sort('name',pymongo.ASCENDING) #name类型升序
result = collection.find({'name':'wyc'}).sort('name',pymongo.DESCEDING) #name类型降序
#偏移和限制
result = collection.find({'name':'wyc'}).sort('name',pymongo.ASCENDING).skip(2).limit(2) #忽略前两个元素和返回两个结果
print(result)

比较符号

符号 含义 示例
$lt 小于 {‘age’: {‘$lt’: 20} }
$gt 大于 {‘age’: {‘$gt’: 20} }
$lte 小于等于 {‘age’: {‘$lte’: 20} }
$gte 大于等于 {‘age’: {‘$gte’: 20} }
$ne 不等于 {‘age’: {‘$ne’: 20} }
$in 在范围内 {‘age’: {‘$in’: [20,23 ] } }
$nin 不在范围内 {‘age’: {‘$nin’: [20,23 ]} }

功能符号

符号 含义 示例 示例含义
$regex 匹配正则表达式 {‘name’: {‘$regex’: ‘^M.*’} } name以M开头
$exists 属性是否存在 {‘name’: {‘$exists’: True } } name属性存在
$type 类型判断 {‘age’:{‘$type’:’int’ }} age的类型为int
$mod 数字模操作 {‘age’:{‘$mod’:[5,0] }} 年龄模5余0
$text 文本查询 {‘$text’:{‘$search’: ‘Mike’ }} text类型的属性中包含Mike字符串
$where 高级条件查询 {‘$where’:’obj.fans_count == obj.follows_count’} 自身粉丝数等于关注数

更新数据

import pymongo
client = pymongo.MongoClient('mongodb://用户名:密码@ip:27017/')
db = client.test #连接test数据库 等价于 client['test']
collection = db.students #stdents表 等价于 db['students']

student = collection.find_one({'name':'wyc'})
student['age'] = 25
#更新一个
result = collection.update_one({'name':'wyc'},{'$set':student})
#更新多个
result = collection.update_many({'name':'wyc'},{'$inc':{'age':1}}) #年龄加一

删除数据

import pymongo
client = pymongo.MongoClient('mongodb://用户名:密码@ip:27017/')
db = client.test #连接test数据库 等价于 client['test']
collection = db.students #stdents表 等价于 db['students']
#删除一个
collection.delete_one({'name':'wyc'})
#删除多个
collection.delete_many({'name':'wyc'})

封装的方法

import pymongo
class Mongo():
    def __init__(self,user,password,uri):
        '''
        初始化MongoDB连接
        :param user: 用户名
        :param password: 密码
        :param uri: ip+port
        '''
        self.client = pymongo.MongoClient('mongodb://{}:{}@{}/'.format(user,password,uri))

con = Mongo('用户名','密码','ip:port')
db = con.client.myDb
collection = db.students

#插入数据
# result = collection.insert_one({'name':'wyc','age':13})
# result2 = collection.insert_many([{'name':'wyc','age':12},{'name':'wyl','age':11}])
# print(result,result2)

#查询
# result = collection.find({'name':'wyc'})
# for i in result:
#     print(i)
# print(result)

#更新
# student = collection.find({'name':'wyc'})
# result = collection.update_one({'name':'wyc'},{'$set':student})
# result = collection.update_many({'name':'wyc'},{'$inc':{'age':1}})
# print(result)

#删除
collection.delete_many({'name':'wyc'})

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

leetcode之Python Previous
pymysql库 Next