第一次使用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/
命令行接口连接
# コンテナに入る
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可以轻松地添加字段(列)。
这是因为集合(表)本身并没有定义字段信息,而是在文档(记录,行)级别上保持字段信息。
嗯?
因为字段信息是以记录(行)的形式保存的。
真的吗!!!!到底有没有所谓的”列”的概念。每个记录都是独立的吗。太厉害了!!!!
真开心!要试着使用一下!