第一次使用MongoDB

启动

在中国,只需要一个选项,请使用中文重新表述以下内容:通过Docker运行两个容器,一个是MongoDB,另一个是Mongo-Express数据查看器。

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

请提供一个中文的选项来改写以下英文句子:
https://hub.docker.com/_/mongo

启动

docker-compose up -d

MongoDB和Mongo Express这两个容器将会被启动。

# docker ps | grep mongo
b8f3154dda29        mongo-express                               "tini -- /docker-ent…"   34 minutes ago      Up 33 minutes       0.0.0.0:8082->8081/tcp           mongo_mongo-express_1
06e8e28840bb        mongo                                       "docker-entrypoint.s…"   35 minutes ago      Up 33 minutes       27017/tcp                        mongo_mongo_1

Mongo-Express 蒙戈表达

mongo-express可以通过以下URL访问:
http://localhost:8081/

image.png
image.png
image.png

命令行接口连接

# コンテナに入る
docker exec -it mongo_mongo_1 bash

# cli起動
root@06e8e28840bb:/# mongo -u root -p example
...
...
...
>

成功连接。用户名/密码是通过 MONGO_INITDB_ROOT_USERNAME/PASSWORD 设置的。

尝试使用

我将追踪神秘的报道,并提取出重要的部分来看看。

MongoDB的基础入门教程
https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521

太惊讶了,创建数据库超级简单。

> use study

不是創建嗎!只用“use”來創作。太棒了!

我在插入数据的同时尝试执行select语句。

> db.stats()

# records 登録
db.user.insert({name:'mr.a', age:10, gender:'m', hobbies:['programming']});
db.user.insert({name:'mr.b', age:20, gender:'m', hobbies:['vi']});
db.user.insert({name:'ms.c', age:30, gender:'f', hobbies:['programming', 'vi']});
db.user.insert({name:'ms.d', age:40, gender:'f', hobbies:['cooking']});

# select * from study
> db.user.find()

# where
 db.user.find( {name:'ms.c'} )

配列(not dict) は文字列のように検索できる
> db.user.find({hobbies:'programming'})
{ "_id" : ObjectId("5ee1a837b84ea8cc6e82073f"), "name" : "ms.c", "age" : 30, "gender" : "f", "hobbies" : [ "programming", "vi" ] }

更新文件

MongoDB的更新操作会使用传递给它的第二个参数进行覆盖保存。
这是个陷阱。极其危险的陷阱。

これが
{ "name" : "mr.a", "age" : 10, "gender" : "m", "hobbies" : [ "programming" ] }

updateすると
db.user.update({name:'mr.a'}, {gender:'X'})

こうなっちゃう
{ "gender" : "X" }

NoSQLあるある。

実はこれ、mr.aさんの性別を更新したというよりも、名前がmr.aというドキュメントをgender:Xというドキュメントで上書きしたということになります。

感覺更像是替換而不是覆蓋。

じゃあどうするんだよ。。。という話ですが、そのために、$setという修飾子を利用する必要があります。
本来は、$setを使って以下のようにする必要があったわけです。

> db.user.update({name:'mr.a'}, {$set:{gender:'X'}})

也许相较于Elasticsearch来说,可能会更简单。难道所有的NoSQL都是这样的吗?更新真的很麻烦,让人讨厌呢。

所以,这个更新也有陷阱。

如果是这样,那么只有MongoDB最初找到的1条记录会被更新。
要一次性更新2条或更多相关记录,需要在第4个参数中传递true。

> db.user.update({}, {$set:{gender:'X'}}, false, true)

初次见面太过惊艳了……

更新或插入

据说upsert语句并不存在,对于update函数的第三个参数来说,将其设置为true是一个令人遗憾的规范。虽然有就好了。

> db.counter.update( {type:'error'} ,{$inc:{count:1}}, true)

添加列

我今天想知道的是这个。就是能像elasticsearch一样轻松地添加字段吗?结论是:比elasticsearch更方便!

在MongoDB中,我认为这是一个非常重要的方面。与关系数据库管理系统(RDBMS)不同,MongoDB可以轻松地添加字段(列)。
这是因为集合(表)本身并没有定义字段信息,而是在文档(记录,行)级别上保持字段信息。

嗯?

因为字段信息是以记录(行)的形式保存的。

真的吗!!!!到底有没有所谓的”列”的概念。每个记录都是独立的吗。太厉害了!!!!

真开心!要试着使用一下!

广告
将在 10 秒后关闭
bannerAds