MongoDB学习笔记 - XLab-Tongji/KAOSer GitHub Wiki
MongoDB
MongoDB(来自“humongous”)是一个跨平台的面向文档的数据库。
MongoDB被归类为NoSQL数据库,它避开了传统的基于表的关系数据库结构,支持使用动态模式的类似JSON的文档(MongoDB调用BSON格式),使得某些类型的应用程序中的数据集成更容易,更快捷。
Docker中安装MongoDB
查找Docker Hub上的mongo镜像:
runoob@runoob:~/mongo$ docker search mongo
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mongo MongoDB document databases ... 1989 [OK]
mongo-express Web-based MongoDB admin int... 22 [OK]
mvertes/alpine-mongo light MongoDB container 19 [OK]
mongooseim/mongooseim-docker MongooseIM server the lates... 9 [OK]
torusware/speedus-mongo Always updated official Mon... 9 [OK]
jacksoncage/mongo Instant MongoDB sharded cluster 6 [OK]
mongoclient/mongoclient Official docker image for M... 4 [OK]
jadsonlourenco/mongo-rocks Percona Mongodb with Rocksd... 4 [OK]
asteris/apache-php-mongo Apache2.4 + PHP + Mongo + m... 2 [OK]
19hz/mongo-container Mongodb replicaset for coreos 1 [OK]
nitra/mongo Mongo3 centos7 1 [OK]
ackee/mongo MongoDB with fixed Bluemix p... 1 [OK]
kobotoolbox/mongo https://github.com/kobotoolb... 1 [OK]
valtlfelipe/mongo Docker Image based on the la... 1 [OK]
拉取官方的镜像:
docker pull mongo
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mongo的镜像。
运行容器:
docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo
命令说明:
-p 27017:27017 :将容器的27017 端口映射到主机的27017 端口
-v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储
查看容器启动状态:docker ps
连接到MongoDB
可以在shell中键入mongo,并可以开始查询数据库。
Mongo shell是一个实用程序,允许您连接到数据库,查询它并执行管理操作。 默认情况下,它连接到端口27017上的本地mongod实例。您还可以使用它连接到远程数据库。 为了确保我们正常运行,我们将检查版本。
- 键入
version()
以获取mongo shell版本。 - 键入
db.version()
以获取数据库版本。
基本概念
数据库database
数据库是一组集合(表)。 每个数据库都物理存储为主机文件系统上的文件。 单个MongoDB实例可以托管多个数据库。 它等同于RDBMS模式(关系数据库管理系统)。 要查看当前存在的数据库,请键入show dbs。 默认情况下将看到local和admin的数据库。
集合collection
集合是一组记录。 它相当于RDBMS表。 集合存在于单个数据库中。 集合不强制执行架构。 集合中的记录可以具有不同的字段。 通常,集合中的所有记录都具有相似或相关的目的。
记录document
MongoDB中的条目称为文档,由JSON对象表示,它们等同于mysql表中的一行。文档具有动态模式,这意味着同一集合中的文档不需要具有相同的字段或结构集。
插入记录
使用特定的数据库: use DATABASE_NAME
检查当前使用的数据库:db
将第一个记录插入到集合中。 我们不需要提前创建集合 - 只要我们插入第一个记录就会创建它。
要插入记录,我们使用db.collection_name.insert(document)
,其中document是表示我们要存储的对象的JSON。
例:
- db.users.insert( {
fname: "John",
lname: "Doe",
email: "[email protected]",
age: 25
});
find()命令
show collections
或 db.getCollectionNames()
可以看到集合。
db.COLLECTION_NAME.find()
可以查找该集合的所有记录。
db.COLLECTION_NAME.find().pretty()
是更可读的形式。
Document_id
每个文档都有一个_id字段,作为其主键。 该字段在集合中的所有文档中必须是唯一的。 插入文档时,如果_id字段未作为文档的一部分提供,MongoDB将生成自己的ObjectId。
基本查询语句
查询也表示为JSON文档。使用find()命令
db.CLOOECTION_NAME.find({条件})
例:db.users.find({fname:"John"})
db.users.find({age: {$gt: 30}})
MongoDB中条件操作符有:
(>) 大于 - $gt (<) 小于 - $lt (>=) 大于等于 - $gte (<= ) 小于等于 - $lte
记录排序
使用sort()命令对查询结果进行排序。 它需要一个json作为参数。 定义按哪个字段排序,以及是按升序还是按顺序排序。
- 例:按年龄升序:
db.users.find().sort({age:1}).pretty()
按年龄降序:db.users.find().sort({age:-1}).pretty()
更新记录
使用update()命令更改文档。 update()命令需要2个参数,一个查询来选择要更新的文档,以及一个更新指令。通常,我们在更新部分中使用$ set运算符,以将值设置为文档中的特定字段。
- 例:
db.users.update({fname:"John"},{$set: {age:50}})
默认情况下,update()将更新与查询部分匹配的单个文档。 如果我们想要更新多个文档,我们需要通过向更新命令添加{multi:true}来明确说明它。
- 例:
db.users.update({lname:"Doe"},{$set:{age:15}},{multi:true})
findOne()将返回与查询匹配的单个文档 - 找到的第一个文档。
投影操作
- 例:
db.users.find({},{email:1})
请注意,我们有一个空{}。 这是一个空查询,因为我们想要查找所有对象。 第二个{}块是投影块,它指示查询仅返回电子邮件字段。默认情况下,还会返回_id字段。 你也可以删除它:db.users.find({},{_id:0, email:1})
删除操作
我们使用remove()命令删除对象。 与find()和update()类似,它采用查询参数(作为json)来定义要删除的文档。 与update()不同,它对所有匹配的对象进行操作。
- 例:
db.users.remove({age:{$lt:20}})
我们可以使用drop()
删除整个集合: - 例:
db.users.drop()
可以使用db.users.remove({})
删除集合中的所有文档,而不删除集合本身。 要删除单个文档,请将{justOne:true}添加到remove()选项:db.users.remove({},{justOne:true})