Tornadoを使ってみる

MongoDBアクセス


WEBサーバーではsqliteがよく使われますが、こ ちらにTornadoでMongoDBを扱うサンプルが公開されています。
MongoDBはSQLではなくKVS(Key-Value Store)と呼ばれるタイプのDBで、
Googleが使っているBigTableやAmzonが使っているAmazon SimpleDBもKVS(分散KVS)です。
そこで、こ ちらの手順に従ってMongoDB Community Edition(以降、MongoDB)をインストールします。
私が使っているのはUbuntu 18.04なので、こ ちらの手順に従います。

最初にUbuntu版のmongodbを削除します。
理由は以下の通りです。
The mongodb-org package is officially maintained and supported by MongoDB Inc.
and kept up-to-date with the most recent MongoDB releases.
This installation procedure uses the mongodb-org package.

The mongodb package provided by Ubuntu is not maintained by MongoDB Inc.
and conflicts with the mongodb-org package.
To check if Ubuntu’s mongodb package is installed on the system, run sudo apt list --installed | grep mongodb.
You can use sudo apt remove mongodb and sudo apt purge mongodb to remove and purge the mongodb package before attempting this procedure.

mongodb-orgパッケージは、MongoDB Incによって公式に保守およびサポートされています。
そして、最新のMongoDBリリースで最新の状態を保ちました。
このインストール手順では、mongodb-orgパッケージを使用します。

Ubuntuが提供するmongodbパッケージは、MongoDB Incによって管理されていません。
また、mongodb-orgパッケージと競合します。
Ubuntuのmongodbパッケージがシステムにインストールされているかどうかを確認するには、sudo apt list --installed | grep mongodb。
この手順を実行する前に、sudo apt remove mongodbおよびsudo apt purge mongodbを使用して、mongodbパッケージを削除およびパージできます。

後は、こ ちらの手順のままです。
# Import the public key used by the package management system.

$ wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
OK

# Create a list file for MongoDB
# Create the /etc/apt/sources.list.d/mongodb-org-4.2.list file for Ubuntu 18.04 (Bionic):

$ 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

$ cat /etc/apt/sources.list.d/mongodb-org-4.2.list
deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse

$ sudo apt-get update

$ sudo apt-get install -y mongodb-org

続いてDB本体を作成します。
デフォルトでは、/data/dbにDBが作られます。
$ sudo mkdir -p /data/db

$ sudo chmod 0777 /data/db

$ sudo chown -R mongodb:mongodb /data/db

$ ls -ld /data/db/
drwxr-xr-x 2 mongodb mongodb 4096 12月 13 12:43 /data/db/

コンソールからDBサーバーを起動します。
幾つかワーニングが出ますがとりあえず動きます。
$ mongod
2019-12-13T12:53:32.353+0900 I  CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] MongoDB starting : pid=9636 port=27017 dbpath=/data/db 64-bit host=Compaq-Pro
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] db version v4.2.2
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] git version: a0bbbff6ada159e19298d37946ac8dc4b497eadf
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] allocator: tcmalloc
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] modules: none
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] build environment:
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten]     distmod: ubuntu1804
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten]     distarch: x86_64
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten]     target_arch: x86_64
2019-12-13T12:53:32.356+0900 I  CONTROL  [initandlisten] options: {}
2019-12-13T12:53:32.356+0900 I  STORAGE  [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2019-12-13T12:53:32.356+0900 I  STORAGE  [initandlisten]
2019-12-13T12:53:32.356+0900 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-12-13T12:53:32.356+0900 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-12-13T12:53:32.356+0900 I  STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=1395M,cache_overflow=(file_max=0M),session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress],
2019-12-13T12:53:32.997+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209212:997916][9636:0x7f3f845d5b00], txn-recover: Recovering log 1 through 2
2019-12-13T12:53:33.066+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209213:66787][9636:0x7f3f845d5b00], txn-recover: Recovering log 2 through 2
2019-12-13T12:53:33.134+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209213:134865][9636:0x7f3f845d5b00], txn-recover: Main recovery loop: starting at 1/22784 to 2/256
2019-12-13T12:53:33.222+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209213:222796][9636:0x7f3f845d5b00], txn-recover: Recovering log 1 through 2
2019-12-13T12:53:33.319+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209213:319865][9636:0x7f3f845d5b00], txn-recover: Recovering log 2 through 2
2019-12-13T12:53:33.367+0900 I  STORAGE  [initandlisten] WiredTiger message [1576209213:367671][9636:0x7f3f845d5b00], txn-recover: Set global recovery timestamp: (0,0)
2019-12-13T12:53:33.632+0900 I  RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-12-13T12:53:33.638+0900 I  STORAGE  [initandlisten] Timestamp monitor starting
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten]
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten]
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] ** WARNING: This server is bound to localhost.
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          Remote systems will be unable to connect to this server.
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          Start the server with --bind_ip <address> to specify which IP
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          addresses it should serve responses from, or with --bind_ip_all to
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          bind to all interfaces. If this behavior is desired, start the
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten] **          server with --bind_ip 127.0.0.1 to disable this warning.
2019-12-13T12:53:33.714+0900 I  CONTROL  [initandlisten]
2019-12-13T12:53:33.717+0900 I  SHARDING [initandlisten] Marking collection local.system.replset as collection version: <unsharded>
2019-12-13T12:53:33.720+0900 I  STORAGE  [initandlisten] Flow Control is enabled on this deployment.
2019-12-13T12:53:33.720+0900 I  SHARDING [initandlisten] Marking collection admin.system.roles as collection version: <unsharded>
2019-12-13T12:53:33.720+0900 I  SHARDING [initandlisten] Marking collection admin.system.version as collection version: <unsharded>
2019-12-13T12:53:33.722+0900 I  SHARDING [initandlisten] Marking collection local.startup_log as collection version: <unsharded>
2019-12-13T12:53:33.722+0900 I  FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2019-12-13T12:53:33.724+0900 I  SHARDING [LogicalSessionCacheReap] Marking collection config.system.sessions as collection version: <unsharded>
2019-12-13T12:53:33.724+0900 I  NETWORK  [initandlisten] Listening on /tmp/mongodb-27017.sock
2019-12-13T12:53:33.724+0900 I  SHARDING [LogicalSessionCacheReap] Marking collection config.transactions as collection version: <unsharded>
2019-12-13T12:53:33.724+0900 I  NETWORK  [initandlisten] Listening on 127.0.0.1
2019-12-13T12:53:33.724+0900 I  NETWORK  [initandlisten] waiting for connections on port 27017
2019-12-13T12:53:34.000+0900 I  SHARDING [ftdc] Marking collection local.oplog.rs as collection version: <unsharded>



MongoDBのクライアントはmongoです。
SQL-DBではないので、ちょっと戸惑います。
こちらに 詳しい解説が有ります。
MongoDBではテーブルのことをCollectionと呼び、各行(レコード)のことをDocumentと呼びます。
また、検索にはcriteriaを使います。
$ mongo
# 使用するデータベースの選択

> use tutorial

# Collectionの表示
> show collections


# Documentの追加
> db.customers.insertOne(
    { name: "Nakamura", age: 34, cars: [ "Suzuki Mira" ], place:"Nagoya" }
)


# 複数のDocumentの追加
> db.customers.insertMany(
    [
        { name: "Satou", age: 23, cars: [ "BMW 320d", "Audi R8" ], place:"Osaka" },
        { name: "Suzuki", age: 24, cars: [ "Audo A7", "Agera R" ], place:"Kanagawa" },
        { name: "Takahashi", age: 25, cars: [ "Audi R8" ] },
        { name: "Tanaka", age: 25, cars: [ "Toyota Crown" ], place:"Tokyo" },
        { name: "Itou", age: 23, cars: [ "Honda Fit" ], place:"Osaka" },
        { name: "Watanabe", age: 24, cars: [ "Toyota 2000GT" ], place:"Tokyo" }
    ]
)

# customersのCollectionができる
> show collections
customers


# Query All Documents in a Collection
> db.customers.find({})
{ "_id" : ObjectId("5df3239e7324a3856616e60b"), "name" : "Satou", "age" : 23, "cars" : [ "BMW 320d", "Audi R8" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e60c"), "name" : "Suzuki", "age" : 24, "cars" : [ "Audo A7", "Agera R" ], "place" : "Kanagawa" }
{ "_id" : ObjectId("5df3239e7324a3856616e60d"), "name" : "Takahashi", "age" : 25, "cars" : [ "Audi R8" ] }
{ "_id" : ObjectId("5df3239e7324a3856616e60e"), "name" : "Tanaka", "age" : 25, "cars" : [ "Toyota Crown" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df3239e7324a3856616e60f"), "name" : "Itou", "age" : 23, "cars" : [ "Honda Fit" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e610"), "name" : "Watanabe", "age" : 24, "cars" : [ "Toyota 2000GT" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df323af7324a3856616e611"), "name" : "Nakamura", "age" : 34, "cars" : [ "Suzuki Mira" ], "place" : "Nagoya" }


# Query Documents of a Collection based on a Criteria
> criteria={name:"Tanaka"}
{ "name" : "Tanaka" }
> db.customers.find(criteria)
{ "_id" : ObjectId("5df3134d79e0e6b6d7671a76"), "name" : "Tanaka", "age" : 25, "cars" : [ "Toyota Crown" ], "place" : "Tokyo" }

> criteria={age:23}
{ "age" : 23 }
> db.customers.find(criteria)
{ "_id" : ObjectId("5df3134d79e0e6b6d7671a73"), "name" : "Satou", "age" : 23, "cars" : [ "BMW 320d", "Audi R8" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3134d79e0e6b6d7671a77"), "name" : "Itou", "age" : 23, "cars" : [ "Honda Fit" ], "place" : "Osaka" }


> criteria={place:"Tokyo"}
{ "place" : "Tokyo" }
> db.customers.find(criteria)
{ "_id" : ObjectId("5df3134d79e0e6b6d7671a76"), "name" : "Tanaka", "age" : 25, "cars" : [ "Toyota Crown" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df3134d79e0e6b6d7671a78"), "name" : "Watanabe", "age" : 24, "cars" : [ "Toyota 2000GT" ], "place" : "Tokyo" }


# MongoDB Projection
> projection_doc={"name":1,"place":1,_id:0}
> db.customers.find({},projection_doc)
{ "name" : "Satou", "place" : "Osaka" }
{ "name" : "Suzuki", "place" : "Kanagawa" }
{ "name" : "Takahashi" }
{ "name" : "Tanaka", "place" : "Tokyo" }
{ "name" : "Itou", "place" : "Osaka" }
{ "name" : "Watanabe", "place" : "Tokyo" }
{ "name" : "Nakamura", "place" : "Nagoya" }

> exit




sqliteと違ってクラサバのDBなので、起動時のオプションで「--bind_ip_all」を付ければネットワーク越しに使えます。
$ mongod --bind_ip_all
2019-12-13T17:05:53.720+0900 I  CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] MongoDB starting : pid=11045 port=27017 dbpath=/data/db 64-bit host=Compaq-Pro
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] db version v4.2.2
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] git version: a0bbbff6ada159e19298d37946ac8dc4b497eadf
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] allocator: tcmalloc
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] modules: none
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] build environment:
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten]     distmod: ubuntu1804
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten]     distarch: x86_64
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten]     target_arch: x86_64
2019-12-13T17:05:53.724+0900 I  CONTROL  [initandlisten] options: { net: { bindIp: "*" } }
2019-12-13T17:05:53.724+0900 I  STORAGE  [initandlisten] Detected data files in /data/db created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2019-12-13T17:05:53.724+0900 I  STORAGE  [initandlisten]
2019-12-13T17:05:53.724+0900 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-12-13T17:05:53.724+0900 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-12-13T17:05:53.724+0900 I  STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=1395M,cache_overflow=(file_max=0M),session_max=33000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000,close_scan_interval=10,close_handle_minimum=250),statistics_log=(wait=0),verbose=[recovery_progress,checkpoint_progress],
2019-12-13T17:05:54.367+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:367158][11045:0x7f4ea0696b00], txn-recover: Recovering log 4 through 5
2019-12-13T17:05:54.413+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:413140][11045:0x7f4ea0696b00], txn-recover: Recovering log 5 through 5
2019-12-13T17:05:54.482+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:482512][11045:0x7f4ea0696b00], txn-recover: Main recovery loop: starting at 4/5888 to 5/256
2019-12-13T17:05:54.573+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:573772][11045:0x7f4ea0696b00], txn-recover: Recovering log 4 through 5
2019-12-13T17:05:54.672+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:672106][11045:0x7f4ea0696b00], txn-recover: Recovering log 5 through 5
2019-12-13T17:05:54.721+0900 I  STORAGE  [initandlisten] WiredTiger message [1576224354:721094][11045:0x7f4ea0696b00], txn-recover: Set global recovery timestamp: (0,0)
2019-12-13T17:05:55.001+0900 I  RECOVERY [initandlisten] WiredTiger recoveryTimestamp. Ts: Timestamp(0, 0)
2019-12-13T17:05:55.008+0900 I  STORAGE  [initandlisten] Timestamp monitor starting
2019-12-13T17:05:55.083+0900 I  CONTROL  [initandlisten]
2019-12-13T17:05:55.083+0900 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-12-13T17:05:55.083+0900 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-12-13T17:05:55.083+0900 I  CONTROL  [initandlisten]
2019-12-13T17:05:55.088+0900 I  SHARDING [initandlisten] Marking collection local.system.replset as collection version: <unsharded>
2019-12-13T17:05:55.090+0900 I  STORAGE  [initandlisten] Flow Control is enabled on this deployment.
2019-12-13T17:05:55.090+0900 I  SHARDING [initandlisten] Marking collection admin.system.roles as collection version: <unsharded>
2019-12-13T17:05:55.090+0900 I  SHARDING [initandlisten] Marking collection admin.system.version as collection version: <unsharded>
2019-12-13T17:05:55.092+0900 I  SHARDING [initandlisten] Marking collection local.startup_log as collection version: <unsharded>
2019-12-13T17:05:55.092+0900 I  FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2019-12-13T17:05:55.094+0900 I  SHARDING [LogicalSessionCacheRefresh] Marking collection config.system.sessions as collection version: <unsharded>
2019-12-13T17:05:55.094+0900 I  NETWORK  [initandlisten] Listening on /tmp/mongodb-27017.sock
2019-12-13T17:05:55.094+0900 I  NETWORK  [initandlisten] Listening on 0.0.0.0
2019-12-13T17:05:55.094+0900 I  SHARDING [LogicalSessionCacheReap] Marking collection config.transactions as collection version: <unsharded>
2019-12-13T17:05:55.094+0900 I  NETWORK  [initandlisten] waiting for connections on port 27017
2019-12-13T17:05:56.000+0900 I  SHARDING [ftdc] Marking collection local.oplog.rs as collection version: <unsharded>

リモートからアクセスしてみましたが、参照、更新とも問題なく動きます。
$ mongo --host 192.168.10.41
MongoDB shell version v4.2.2
connecting to: mongodb://192.168.10.41:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("6a026fb3-b9f2-48c5-8ba8-0e487a3b19bf") }
MongoDB server version: 4.2.2
Server has startup warnings:
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten]
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten]
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> use tutorial
switched to db tutorial

> db.customers.find({})
{ "_id" : ObjectId("5df3239e7324a3856616e60b"), "name" : "Satou", "age" : 23, "cars" : [ "BMW 320d", "Audi R8" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e60c"), "name" : "Suzuki", "age" : 24, "cars" : [ "Audo A7", "Agera R" ], "place" : "Kanagawa" }
{ "_id" : ObjectId("5df3239e7324a3856616e60d"), "name" : "Takahashi", "age" : 25, "cars" : [ "Audi R8" ] }
{ "_id" : ObjectId("5df3239e7324a3856616e60e"), "name" : "Tanaka", "age" : 25, "cars" : [ "Toyota Crown" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df3239e7324a3856616e60f"), "name" : "Itou", "age" : 23, "cars" : [ "Honda Fit" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e610"), "name" : "Watanabe", "age" : 24, "cars" : [ "Toyota 2000GT" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df323af7324a3856616e611"), "name" : "Nakamura", "age" : 34, "cars" : [ "Suzuki Mira" ], "place" : "Nagoya" }

> db.customers.insertOne({ name: "Yoshida", age: 28, cars: [ "Daihatsu Move" ], place:"Yokohama" })
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5df8bdb44527ca1fd7cae638")
}

> db.customers.find({})
{ "_id" : ObjectId("5df3239e7324a3856616e60b"), "name" : "Satou", "age" : 23, "cars" : [ "BMW 320d", "Audi R8" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e60c"), "name" : "Suzuki", "age" : 24, "cars" : [ "Audo A7", "Agera R" ], "place" : "Kanagawa" }
{ "_id" : ObjectId("5df3239e7324a3856616e60d"), "name" : "Takahashi", "age" : 25, "cars" : [ "Audi R8" ] }
{ "_id" : ObjectId("5df3239e7324a3856616e60e"), "name" : "Tanaka", "age" : 25, "cars" : [ "Toyota Crown" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df3239e7324a3856616e60f"), "name" : "Itou", "age" : 23, "cars" : [ "Honda Fit" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e610"), "name" : "Watanabe", "age" : 24, "cars" : [ "Toyota 2000GT" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df323af7324a3856616e611"), "name" : "Nakamura", "age" : 34, "cars" : [ "Suzuki Mira" ], "place" : "Nagoya" }
{ "_id" : ObjectId("5df8bdb44527ca1fd7cae638"), "name" : "Yoshida", "age" : 28, "cars" : [ "Daihatsu Move" ], "place" : "Yokohama" }


> exit
bye



RaspberryPiにmongodb(mongodb-orgではないほう)をインストールしました。
動作保証外ですがリモートで参照だけはできました。
更新はエラーになりました。
$ mongo --host 192.168.10.41
MongoDB shell version: 2.4.14
connecting to: 192.168.10.41:27017/test
Server has startup warnings:
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten]
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2019-12-13T21:07:01.416+0900 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten]
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2019-12-13T21:07:02.765+0900 I  CONTROL  [initandlisten]
> use tutorial
switched to db tutorial

> db.customers.find({})
{ "_id" : ObjectId("5df3239e7324a3856616e60b"), "name" : "Satou", "age" : 23, "cars" : [  "BMW 320d",  "Audi R8" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e60c"), "name" : "Suzuki", "age" : 24, "cars" : [  "Audo A7",  "Agera R" ], "place" : "Kanagawa" }
{ "_id" : ObjectId("5df3239e7324a3856616e60d"), "name" : "Takahashi", "age" : 25, "cars" : [  "Audi R8" ] }
{ "_id" : ObjectId("5df3239e7324a3856616e60e"), "name" : "Tanaka", "age" : 25, "cars" : [  "Toyota Crown" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df3239e7324a3856616e60f"), "name" : "Itou", "age" : 23, "cars" : [  "Honda Fit" ], "place" : "Osaka" }
{ "_id" : ObjectId("5df3239e7324a3856616e610"), "name" : "Watanabe", "age" : 24, "cars" : [  "Toyota 2000GT" ], "place" : "Tokyo" }
{ "_id" : ObjectId("5df323af7324a3856616e611"), "name" : "Nakamura", "age" : 34, "cars" : [  "Suzuki Mira" ], "place" : "Nagoya" }

> db.customers.insertOne(
...     { name: "Yoshida", age: 28, cars: [ "Daihatsu Move" ], place:"Yokohama" }
... )
Fri Dec 13 21:39:31.586 TypeError: Property 'insertOne' of object tutorial.customers is not a function
> exit
bye



pythonでも簡単にCollection(≒テーブル)を作ることができます。
以下のコードでCollection=exampleにDocument(≒レコード)を追加します。
#!/bin/python
import pymongo
conn = pymongo.MongoClient("localhost", 27017)
db = conn.example
db.words.insert({"word": "oarlock", "definition": "A device attached to a rowboat to hold the oars in place"})
db.words.insert({"word": "seminomadic", "definition": "Only partially nomadic"})
db.words.insert({"word": "perturb", "definition": "Bother, unsettle, modify"})

Collection=exampleを作ったらこ ちらのdefinitions_readonly.pyを実行します。
URLパラメータに以下を指定すると、データベースからword=perturbを検索し、その内容を表示します。


curlでも問い合わせを行うことができます。


続く...