在Ubuntu上安装MongoDB并使用Shell和Python进行操作验证
我在Ubuntu上安装了MongoDB,并使用Shell和Python(PyMongo包)进行了简单的操作确认。安装方法请参考“在Ubuntu上安装MongoDB社区版”,并参考“入门指南”。
环境
流程
1. 安装
使用.deb软件包进行安装。
1.1. 导入MongoDB的公钥
从终端导入MongoDB的公钥。
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
1.2. 创建MongoDB的列表文件
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
1.3. 重新加载包DB
sudo apt-get update
1.4. 安装MongoDB
sudo apt-get install -y mongodb-org
2. MongoDB启动
2.1. 启动MongoDB
启动mongod
sudo service mongod start
从日志文件中确认启动情况。
sudo cat /var/log/mongodb/mongod.log
查看日志文件以确认是否已启动。如果已启动,则会在最后一行输出等待请求的默认端口27017。
2019-09-09T17:09:45.872+0900 I NETWORK [initandlisten] waiting for connections on port 27017
3. 可以简单地在Mongo Shell中尝试
在启动mongod的状态下,尝试使用mongo shell。
3.1. 使用默认端口连接本地 MongoDB。
使用默认端口27017连接到本地的MongoDB。
mongo
显示数据库。test是默认数据库的名称。
$ db
test
DB的更改。这次选择了未注册的数据库myNewDatabase,并同时进行数据库注册和更改。
$ use myNewDatabase
switched to db myNewDatabase
向myNewDatabase中的myCollection表进行插入操作。
$ db.myCollection.insertOne( { x: 1 } );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb9166e0424b2e17c7ce5eb")
}
执行取得表中值的查询。
$ db.myCollection.find().pretty()
{ "_id" : ObjectId("5cb9166e0424b2e17c7ce5eb"), "x" : 1 }
4. 尝试更深入地使用mongo Shell
我会更深入地尝试mongo Shell一下。
我会注册一个名为inventory的数据库。
$ use inventory
switched to db inventory
4.1. 插入
一次插入多行数据。
$ db.inventory.insertMany([
// MongoDB adds the _id field with an ObjectId if _id is not present
{ item: "journal", qty: 25, status: "A",
size: { h: 14, w: 21, uom: "cm" }, tags: [ "blank", "red" ] },
{ item: "notebook", qty: 50, status: "A",
size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank" ] },
{ item: "paper", qty: 100, status: "D",
size: { h: 8.5, w: 11, uom: "in" }, tags: [ "red", "blank", "plain" ] },
{ item: "planner", qty: 75, status: "D",
size: { h: 22.85, w: 30, uom: "cm" }, tags: [ "blank", "red" ] },
{ item: "postcard", qty: 45, status: "A",
size: { h: 10, w: 15.25, uom: "cm" }, tags: [ "blue" ] }
]);
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5cb9184d0424b2e17c7ce5ec"),
ObjectId("5cb9184d0424b2e17c7ce5ed"),
ObjectId("5cb9184d0424b2e17c7ce5ee"),
ObjectId("5cb9184d0424b2e17c7ce5ef"),
ObjectId("5cb9184d0424b2e17c7ce5f0")
]
}
4.2. 查询
查询系统。
4.2.1. 完全获取
获取所有内容,无搜索条件。
$ db.inventory.find( {} )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5f0"), "item" : "postcard", "qty" : 45, "status" : "A", "size" : { "h" : 10, "w" : 15.25, "uom" : "cm" }, "tags" : [ "blue" ] }
4.2.2. 有条件的搜索
使用搜索条件进行搜索。
$ db.inventory.find( { status: "D" } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
4.2.3. 对于深层次部分的完全匹配搜索
在深层次部分进行完全匹配条件的搜索。
$ db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
4.2.4. 对深层次部分的条件搜索。
在深层次的部分进行常规带条件的搜索。
$ db.inventory.find( { "size.uom": "in" } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
4.2.5. 搜索针对具有多级嵌套的数组类型的深层次部分。
$ db.inventory.find( { tags: "red" } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ec"), "item" : "journal", "qty" : 25, "status" : "A", "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ee"), "item" : "paper", "qty" : 100, "status" : "D", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ef"), "item" : "planner", "qty" : 75, "status" : "D", "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "tags" : [ "blank", "red" ] }
4.2.6. 完全匹配搜索适用于数组类型中的深层部分。
$ db.inventory.find( { tags: ["red", "blank"] } )
{ "_id" : ObjectId("5cb9184d0424b2e17c7ce5ed"), "item" : "notebook", "qty" : 50, "status" : "A", "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "tags" : [ "red", "blank" ] }
4.3. 删除数据库
我将删除此次注册并使用的DBinventory数据库。
我将使用db.dropDatabase命令进行删除,并通过使用show dbs命令来确认它已经不存在了。
$ db.dropDatabase()
{ "dropped" : "inventory", "ok" : 1 }
$ show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
myNewDatabase 0.000GB
4.4. 关闭Shell程序
退出shell。
$ exit
5. Python封装 PyMongo
5.1. 安装
使用pip安装Python包装程序PyMongo。使用venv来管理Python虚拟环境。有关Python版本和虚拟环境管理,请参考“在Ubuntu上使用pyenv和venv搭建Python开发环境”文章。
PyMongo3.9.0已成功安装。
pip install pymongo
使用Jupyter来运行PyMongo。
jupyter lab
用Jupyter在Python上进行执行。
我们将从Jupyter上执行Python操作。
在此之前,我们需要先启动MongoDB。
5.2.1. 连接到MongoDB
连接到本地的MongoDB,并使用默认端口创建一个客户端。
from pymongo import MongoClient
client = MongoClient()
5.2.2. 获取/创建数据库。
本次将创建一个名为test_database的数据库。如果已经创建了,则只需要获取它。也可以使用 db = client[‘test-database’] 的写法。
db = client.test_database
如果使用命令list_database_names,可以确认有哪些数据库存在。
client.list_database_names()
5.2.3. 获取收藏品
获取集合。也可以使用 collection = db[‘test-collection’] 的写法。
collection = db.test_collection
5.2.4. 插入
使用JSON格式准备数据,并使用insert_one函数进行插入。
import datetime
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
使用find_one函数进行结果确认。
import pprint
pprint.pprint(posts.find_one())
输出结果。
{'_id': ObjectId('5d7a4f7055f20912298f04d4'),
'author': 'Mike',
'date': datetime.datetime(2019, 9, 12, 13, 59, 11, 121000),
'tags': ['mongodb', 'python', 'pymongo'],
'text': 'My first blog post!'}
find_one関数は、以下のように条件を追加することもできます。
pprint.pprint(posts.find_one({"author": "Mike"}))
5.2.5. 批量插入
使用insert_many函数进行批量插入。
new_posts = [{"author": "Mike",
"text": "Another post!",
"tags": ["bulk", "insert"],
"date": datetime.datetime(2009, 11, 12, 11, 14)},
{"author": "Eliot",
"title": "MongoDB is fun",
"text": "and pretty easy too!",
"date": datetime.datetime(2009, 11, 10, 10, 45)}]
result = posts.insert_many(new_posts)
result.inserted_ids
5.2.6. 查询和多个结果
可以使用find函数来获得Cursor实例。
全面搜索可以获取所有内容。
for post in posts.find():
pprint.pprint(post)
指定条件也绝对可以。
for post in posts.find({"author": "Mike"}):
pprint.pprint(post)
5.2.7. 计数
使用count_documents函数对结果进行计数。
# 条件指定なし
posts.count_documents({})
# 条件指定
posts.count_documents({"author": "Mike"})
5.2.8. 查询应用
这是一个对查询的应用。在这里,我们使用条件运算符<=来对结果进行排序。请参考Operators以获取更详细的信息。
d = datetime.datetime(2009, 11, 12, 12)
for post in posts.find({"date": {"$lt": d}}).sort("author"):
pprint.pprint(post)
5.2.9. 索引
这是添加索引的操作。在这里我们添加了唯一索引。
from pymongo import ASCENDING
result = db.profiles.create_index([('user_id', ASCENDING)], unique=True)
sorted(list(db.profiles.index_information()))
6. 停止使用MongoDB
通过终端停止MongoDB。
sudo service mongod stop