在Ubuntu上安装MongoDB并使用Shell和Python进行操作验证

我在Ubuntu上安装了MongoDB,并使用Shell和Python(PyMongo包)进行了简单的操作确认。安装方法请参考“在Ubuntu上安装MongoDB社区版”,并参考“入门指南”。

环境

種類バージョン内容OSUbuntu18.04.01 LTS仮想で動かしていますMongoDB4.2.02019年9月に最新Python3.6.8Pyenvで動かしています

流程

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
广告
将在 10 秒后关闭
bannerAds