# 拉取镜像
docker pull mongo
# 启动镜像
docker run --name mongodb -p 27017:27017 -d mongo
# 进入mongo镜像的命令行
docker exec -it mongodb bash
# 查看mongo的日志
docker logs mongodb
# 创建实例,设置账号密码
docker run -d --name mongodb \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo
# 进入实例的命令行,登录数据库
docker run -it --rm mongo \
mongo --host localhost \
-u mongoadmin \
-p secret \
--authenticationDatabase admin \
some-db
doc: https://github.com/docker-library/docs/tree/master/mongo
查看https://pgp.mongodb.com/中,获取最新的mongo版本,如今天2022.5.12看到最新的是6.0
6.0
是当前的mongo版本,需要注意替换 wget -qO - <https://www.mongodb.org/static/pgp/server-6.0.asc> | sudo apt-key add -
focal
是20.04的版本代号,需要换成系统对应的版本,可以使用lsb_release -a
或者cat /etc/lsb-releas
文件查看当前系统的版本代号6.0
是当前的mongo版本,需要注意替换 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
更新镜像源:
sudo apt-get update
使用官方的源安装MongoDB:
sudo apt-get install -y mongodb-org
启动及配置
配置文件在/etc/mongod.conf
中,详细的配置可参考:配置文件官方说明文档
sudo service mongod start
doc: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/
安装pymongo,默认安装最新版
python -m pip install 'pymongo[srv]'
连接mongo服务
import pymongo
# 连接字段说明: https://www.mongodb.com/docs/manual/reference/connection-string/
# https://pymongo.readthedocs.io/en/stable/api/pymongo/mongo_client.html#pymongo.mongo_client.MongoClient
conn_str = "mongodb+srv://<username>:<password>@<cluster-address>/test?retryWrites=true&w=majority"
# 设置超时时间为5s
client = pymongo.MongoClient(conn_str, serverSelectionTimeoutMS=5000)
# 也可以是通过参数的方式传递登录参数
# client = pymongo.MongoClient('<cluster-address>', username='admin',password='password',retryWrites=True)
try:
print(client.server_info())
except Exception:
print("Unable to connect to the server.")
也可以使用稳定版的接口:
# 您可以从MongoDB Server版本5.0和PyMongo驱动程序版本3.12开始使用稳定API功能。使用稳定 API 功能时,可以更新驱动程序或服务器,而不必担心稳定 API 涵盖的任何命令的向后兼容性问题。
from pymongo.mongo_client import MongoClient
from pymongo.server_api import ServerApi
conn_str = "<connection string>"
# 设置api的版本
client = pymongo.MongoClient(conn_str, server_api=ServerApi('1'), serverSelectionTimeoutMS=5000)
获取数据库
# 使用`.`访问数据库
db = client.test_database
# 或者这样使用字典的方式
db = client['test-database']
获取集合[表]
# 使用`.`访问集合
collection = client.test_collection
# 或者这样使用字典的方式
collection = client['test_collection']
插入文档
import datetime
# 请注意,数据中可以包含本机Python类型(如datetime),这些类型将自动转换为相应的BSON类型。
# BSON类型说明:https://bsonspec.org/
post = {"author": "Mike",
"text": "My first blog post!",
"tags": ["mongodb", "python", "pymongo"],
"date": datetime.datetime.utcnow()}
posts = db.posts
post_id = posts.insert_one(post).inserted_id
print(post_id)
>> ObjectId('...')
插入文档时,如果文档尚未包含key,则会自动添加特殊key,key在整个集合中必须是唯一的。
我们可以通过list_collection_names列出数据库中的所有集合:
db.list_collection_names()
>> ['posts']
查询单个文档
find_one()
查询单条数据 import pprint
res = posts.find_one()
pprint.pprint(res)
>> {'_id': ObjectId('...'),
'author': 'Mike',
'date': datetime.datetime(...),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
find_one()
中还支持匹配特定的数据,返回符合条件的数据 res = collect.find_one({"class_name":"高三(1)班","score":{"$gt":90},"$or":[{"student_name":"张三"},{"student_name":"李四"}]})
pprint.pprint(res)
比较操作符:{"class_name":"高三(1)班","score":{"$gt":90}}
符号 | 含义 |
---|---|
$lt | 小于 |
$lte | 小于等于 |
$gt | 大于 |
$gte | 大于等于 |
$ne | 不等于 |
$in | 在范围内 |
$nin | 不在范围内 |
逻辑操作符表示条件之间的关系: {"$or":[{"student_name":"张三"},{"student_name":"李四"}]}
符号 | 含义 |
---|---|
$and | 按条件取 交集 |
$not | 单个条件的 相反集合 |
$nor | 多个条件的 相反集合 |
$or | 多个条件的 并集 |
除此之外还有:
符号 | 含义 | 示例 | 示例含义 | |
---|---|---|---|---|
$regex | 正则匹配 | {“student_name”:{“regex”:”.∗三”}} | 学生名以 “三” 结尾 | |
$expr | 允许查询中使用 | 聚合表达式 | {“expr”:{“gt”:[“spent”,”budget”]}} | 查询 花费 大于 预算 的超支记录 |
$exists | 属性是否存在 | {“date”:{“$exists”: True}} | date属性存在 | |
$exists | 属性是否存在 | {“date”:{“$exists”: True}} | date属性存在 | |
$type | 类型判断 | {“score”:{“$type”:”int”}} | score的类型为int | |
$mod | 取模操作 | {‘score’: {‘$mod’: [5, 0]}} | 分数取5、0的模 |
批量查询
使用find()
查询多条数据,用法和find_one()
基本一致,但是返回的是一个可迭代的对象。
res = collect.find({"class_name":"高三(1)班","score":{"$gt":90},"$or":[{"student_name":"张三"},{"student_name":"李四"}]})
for val in res:
pprint.pprint(val)
MongoDB服务器批量返回查询结果。批处理中的数据量不会超过最大BSON文档大小。
要覆盖批处理的默认大小,请参见batchSize()
和limit()
。
新版本3.4:类型为find()
、aggregate()
、listIndexes
和listCollections
的操作每批最多返回16兆字节。batchSize()可以执行较小的限制,但不能执行较大的限制。
find()和aggregate()
操作的初始批处理大小默认为101
个文档。针对生成的游标发出的后续getMore
操作没有默认的批处理大小,因此它们仅受16mb
消息大小的限制。
对于包含没有索引的排序操作的查询,服务器必须在返回任何结果之前加载内存中的所有文档来执行排序。
data = []
for info in db["dbs"].find().batch_size(5000): #修改最大限制阈
data.append(info)
print("info nums=",len(info))
但是这种方法是每次游标返回5000条数据,循环遍历,如果单词查找50000次应该怎么写呢?如下
data = []
cousor=db["dbs"].find().batch_size(5000)
for i in range(50000): #修改最大限制阈
data.append(next(cousor))
插入数据
doc: https://www.mongodb.com/docs/drivers/python/
wsl中Ubuntu 22.04中使用apt安装mongo报libssl1.1 (>= 1.1.1) but it is not installable
The following packages have unmet dependencies: mongodb-org-mongos : Depends: libssl1.1 (>= 1.1.1) but it is not installable mongodb-org-server : Depends: libssl1.1 (>= 1.1.1) but it is not installable mongodb-org-shell : Depends: libssl1.1 (>= 1.1.1) but it is not installable
这是因为mongo官方还没有针对22.04的构建(today:2022.5.12,mongo最新版6.0),22.04已经使用ssl3所以这个依赖没有,推荐的方式是使用docker镜像使用mongo,当然也可以强制安装低一点的版本libsssl,方法如下:
echo "deb http://security.ubuntu.com/ubuntu impish-security main" | sudo tee /etc/apt/sources.list.d/impish-security.list
sudo apt-get update
sudo apt-get install libssl1.1
安装之后记得禁用该依赖
ref:https://www.mongodb.com/community/forums/t/installing-mongodb-over-ubuntu-22-04/159931