MongoDB 知识点归纳总结(一)


MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发展而灵活地更新。与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格一致性等等。 MongoDB能够使企业更加具有敏捷性和可扩展性,各种规模的企业都可以通过使用MongoDB来创建新的应用,提高与客户之间的工作效率,加快产品上市时间,以及降低企业成本。

MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企业级的可靠性和操作灵活性。

本文将对 MongoDB 的一些基础知识点进行归纳整理,主要内容包括:

1.MongoDB 数据库操作

2.MongoDB 集合操作

3.MongoDB 数据操作(增删改查)


一、MongoDB 数据库操作

MongoDB 数据库是比较自由的,正如同他本身就是非关系型数据库一样。并不需要单独专门定义数据库,只需直接使用数据库,在插入数据的时候便会创建相应的数据库和集合。

首先使用如下的命令来进入 mongodb 的交互界面:

mongo

数据库切换

查看当前数据库名称

db

列出所有的数据库名称:(列出所有在物理上存储的数据库名称)

show dbs

切换数据库(若数据库不存在则指向数据库,但不创建,直到插入数据或创建集合时才被创建)

use 数据库名称

数据库删除

删除当前指向的数据库,如果数据库不存在则什么也不做

db.Dropdatabases()

二、MongoDB 集合操作

创建集合

语法:

db.createCollection(name,options)

name:是要创建集合的名称

options:是一个文档,用于指定集合的配置(选项参数是可选的,所以只需要指定集合的名称)

示例:

// 不限制集合大小
db.createCollection("stu")

// 限制集合大小
db.createCollection("stu",{capped:true,size:10})

capped:默认值为 false 表示不限制集合大小,为 true 表示限制集合大小

size:当 capped 为 true 时需要指定此参数,表示集合的最大上限,等集合达到此上限时则会覆盖之前的数据,单位为字节。

查看当前数据库的集合

show collections

删除集合

db.集合名称.drop()

三、MongoDB 数据操作

下面是 MongoDB 中常见的几种数据类型:

Object ID:文档id,系统自动生成,不用自己维护

String:字符串类型,必须是有效的utf-8

Boolean:布尔值,true 或者 false

Integer:整数类型,可以时32位或者64位,取决于服务器

Double:浮点类型

Arrays:数组或列表类型,可以将多个值存储到一个键中

Object:文档类型

Null:Null值

Timestamp:时间戳

Date:日期或时间的UNIX时间格式

注意:

每一个文档都有一个默认属性,为 _id,用来保证每个文档的唯一性。这个值可以自己去设置,但为了保证不会重复,采用系统自动生成。可以确保在理论上不会重复。

Object ID 是一个12字节的十六机制数:前四个字节为当前时间戳;接下来三个字节为机器ID;接下来的两个字节为 MongoDB 的服务进程id;最后三个字节位简单的增量值。

(一)、插入数据

语法:

db.集合名.insert(document)

插入数据时,如果不指定_id参数,MongoDB 会为文档分配一个唯一的 Objectid。

例如:

db.stu.insert({name:'wangxin',gender:true})

(二)、查询数据

语法:

db.集合名.find()

1.基本查询

find() :查询

db.集合名.find({条件文档})

findOne() :查询,只返回第一个

db.集合名.findOne({条件文档})

pretty() :将结果格式化

db.集合名.find({条件文档}).pretty()

比较运算符

等于:’:’默认是等于判断,没有运算符

小于$lt

小于或等于$lte

大于$gt

大于或等于$gte

不等于$ne

比如,查询 sub 集合中 count 值大于5的所有文档:

db.sub.find({count:{$gt:5}})

逻辑运算符

查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接

逻辑与:’,’默认就是逻辑与的关系

逻辑或:$or

逻辑或使用:$or[{查询条件1},{查询条件2},…]

示例:查询课程名称为 java 并且 课时大于20的所有内容:

db.sub.find({$or[{title:'java'},{count:{$gt:2}}]})

范围运算符

使用 “$in”,”$nin” 来判断是否在某个范围内

示例:查询年龄在18到25之间的学生:

db.stu.find({age:{$in:[18,25]}})

支持正则表达式查询(MongoDB特有)

使用 // (推荐使用这种)或 $regex编写正则表达式来做为查询条件

例如:查询姓王的学生

db.stu.find({name:/^王/})
db.stu.find({name:{$regex:'^王'}})

自定义函数查询

使用 $where后面写一个函数(js函数),返回满足条件的数据。

通过这种方式便可以实现所有的查询逻辑,所以只需要会写 js 的函数便可以实现各种 MongoDB 的查询。

示例:查询年龄大于20的学生

db.stu.find(
    {$where:function(){
        return this.age>20
    }}
)

2.高级查询

limit 和 skip

limit() :用于读取指定数量的文档

语法:

db.集合名.find().limit(指定所要获取的数量)

如果没有指定所要获取的数量的话则返回集合中所有的文档。

skip():用于跳过指定数量的文档

语法:

db.集合名.find().skip(指定跳过的数量)

一般情况下,limit 和 skip 方法是搭配一起使用的。便可以实现从指定位置开始显示出固定个数的文档。

投影

投影操作支持在查询到的返回结果中,只选择必要的字段,而不是选择一个文档的整个字段。

语法:

参数位字段与值,值为1表示显示,值为0表示不显示

db.集合名.find({},{字段名称:1,...})

对于需要显示的字段将其设置为1,不设置的字段便不会显示。

需要值得注意的是:对于_id是默认显示的,如果不需要显示的话需要将其设置为0。

示例:查询学生的姓名和性别(不显示_id)

db.stu.find({},{name:1,gender:1,_id:0})

排序

sort():用于对结果集进行排序

语法:

db.集合名.find({条件}).sort({字段1:1,...})

参数1:升序排序 参数-1:降序排序

示例:查询学生信息,根据性别降序,根据年龄升序:

db.stu.find({}).sort({gender:-1,age:1})

统计个数

count():用于统计结果集中文档条数

语法:

db.集合名.find({条件}).count()

// 或者
db.集合名.count({条件})

示例:统计男生个数

db.stu,find({gender:1}).count()

消除重复

distinct:对数据进行去重

语法:

db.distinct('去重字段',{条件})

3.修改数据

语法:

db.集合名.update(
    <query>,
    <update>,
    {multi:<boolean>}
)

query:查询条件,类似与 sql 语句 update 中的 where 部分。

update:更新操作符,类似 sql 语句中 update 中的 set 部分。

multi:可选参数,默认为 false,表示只更新找到的第一条记录,值为 true表示把满足条件的文档全部更新。

示例:

<!-- 全文档修改会修改整个文档的结构 -->
db.stu.update({},{name:'wang'})

<!-- 只修改指定属性的值需要使用$set操作符 -->
db.stu.update({},{$set:{name:'wang'}})

<!-- 修改所有满足条件的文档中指定属性的值 -->
db.stu.update({},{$set:{name:'wang'}},{multi:true})

4.保存数据

语法:

db.集合名.save(document)

如果数据存在的话则修改数据,假如数据不存在的话则插入数据。

5.删除数据

语法:

db.集合名.remove(
    <query>,
    {
        justOne:<boolean>
    }
)

query:可选参数,删除文档的条件

justOne:可选参数,为true则只删除一条数据;默认为false,表示删除多条

示例:

<!-- 只删除一条数据 -->
db.stu.remove({gender:0},{justOne:true})

<!-- 全部删除 -->
db.stu.remove({})