Yuque Archive
寻常的路

MongoDB基础与使用概述

下载安装MongoDB,bin目录下mongod.exe负责启动服务,mongo.exe用于连接数据库。

MongoDB中数据库的概念与MySQL相对应,另两个概念是集合和文档。集合如同数据表,由多个文档组成。文档即记录,相当于数据表中的一行。

mongo启动的shell是一个功能完备的JavaScript解释器,可运行JavaScript程序。

增加

MongoDB不需要新建数据库的操作,可在命令行执行如下命令,查看当前使用的数据库名:

默认为test。切换数据库可以使用命令:

MongoDB同样不需要新建集合,直接插入文档即可:

该命令向foo集合插入了一个文档。文档格式类似JSON,与JavaScript的对象相似,但不只是JSON,因为MongoDB要求并拥有比JSON更多的数据类型,比如日期类型。

集合是无模式的,因为可以向同一集合中插入这两个文档:

该文档的值类型不同,键名称也完全不同,这是NoSQL与SQL的一大不同。

查询

MongoDB中使用find()findOne()查询数据,方法可接收多个参数,第一个参数为查询文档的条件,第二个参数为要查询的字段,不传参则为空。该下面的命令查询出foo集合中所有的文档:

可以向查询文档加入多个查询条件,比如查询出usernamejoeage值为27的文档:

也可以指定返回的键,比如只查询usernameemail键:

可以看到结果集中包含三个键,_id总是被返回。这个键是数据库内部标识文档的唯一id,如果要避免返回它,可使用命令:

模糊匹配

查询条件除第一个参数精确匹配外,也可传入比较运算符,实现模糊匹配。比较关键字与比较运算符的对应关系为:

关键字

运算符

$lt

<

$lte

<=

$gt

>

$gte

>=

比如查询条件为18 <= age <= 30,可写为:

or

查询条件实现or关系,可使用$in$or关键字。

单一键有多个值匹配,使用$in,如中奖号码为725、542、390:

与"$in"相对的是"$nin",将返回与数组中与所有条件都不匹配的文档:

希望根据多个键为条件进行查询,使用$or,如中奖号码之外,还要winner键值为true

not

$not是元条件句,可以使用在任何其他条件之上。

null

null关键字一向比较奇怪,MongoDB中,null作为查询条件不仅可以匹配值为null的文档,还能匹配键不存在的文档。

如果仅仅想要匹配键值为null的文档,则需要同时检查键是存在的:

使用$in操作符的原因是,MongoDB中没有$eq操作符。

MongoDB还拥有大量其它运算符、关键字帮助文档的查询,包括但不限于$all$size$slice$elemMatch$where、游标等。find()方法后也可接limit()skip()sort()等方法,对查询结果进行限制。

更新

更新文档最直接的方法是使用update()方法,第一个参数指定条件,第二个参数为修改后的文档:

如果需要应对一些复杂的数据更新的场景,就需要用到修改器。如:

  • $set修改器用于指定一个键的值,如果键不存则创建。
  • $inc修改器用来增加已有键的值,如果键不存在则创建。
  • $push修改器向已有的数组末尾加入一个元素,不存在则创建。

此外还有丰富的修改器以及组合。

数组操作中一个比较常用的是定位修改器,在不知道数组下标的情况下,可以这样使用:

即把评论中用户名为"John"更改为"Jim"。注意定位符只更新第一个匹配到的元素。

MongoDB默认只更新匹配到的第一个文档。如果需要更改匹配到的所有文档,则指定update()方法的第四个参数为true。update()方法的第三个参数指如果文档不存在,是否插入文档,默认为false。

删除

使用remove()方法删除文档,第一个参数指定删除条件:

数据删除是永久的,不能闪回。

在Node.js中使用

执行以下命令安装MongoDB驱动:

Node.js对MongoDB的操作通常是回调的写法,下面是一个简单的插入文档的示例,包含连接数据库并对数据库进行数据插入的操作:

MongoDB非常适用于JavaScript环境。

在Java中使用

在Java中使用MongoDB,需要mongodb-java-driver

获取数据库连接对象:

对数据库的操作均使用collection对象。

如果要创建一个这样的JSON文档:

使用Java要这么写:

一个Document对象相当于一个JavaScript对象。

向数据库中插入文档使用insert方法:

在MongoDB的shell中,使用命令查看文档是否成功插入:

Java中查询数据同样使用find方法,比如查询集合中第一个文档,并打印到控制台:

查询所有文档则需要使用游标:

更多详细用法可查阅官网。

在PHP中使用

PHP中MongoDB作为扩展被加载。

获取连接对象:

获取批量写入对象,并插入三个文档:

查询数据:

更多操作对象可参阅扩展官网。

在Python中使用

使用pip安装pymongo。

测试模块是否成功安装:

获取数据库和集合的操作对象:

从连接对象获取并打印所有存在的数据库和集合名称:

Python拥有字典这样的数据类型,在对MongoDB的操作上会比Java轻松一点。