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 collectionsdb.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})