MongoDB基本用法

252 阅读5分钟
  1. MongoDB的基本概念 |SQL术语/概念 | MongoDB术语/概念 | 解释/说明
    | ------------- | ----------------| -----------------------
    | database | database | 数据库
    | table | collection | 数据库表/集合
    | row | document | 数据记录行/文档
    | column | field | 数据字段/域
    | index | index | 索引
    | table joins |   | 表连接,MongoDB不支持
    | primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 2.MongoDB的数据类型 数据类型 | 描述
    | String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 | | Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 | | Boolean | 布尔值。用于存储布尔值(真/假)。 | | Double | 双精度浮点值。用于存储浮点值。 | | Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 | | Array | 用于将数组或列表或多个值存储为一个键。 | | Timestamp | 时间戳。记录文档修改或添加的具体时间。 | | Object | 用于内嵌文档。 | | Null | 用于创建空值。 | | Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 | | Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 | | Object ID | 对象 ID。用于创建文档的 ID。 | | Binary Data | 二进制数据。用于存储二进制数据。 | | Code | 代码类型。用于在文档中存储 JavaScript 代码。 | | Regular expression | 正则表达式类型。用于存储正则表达式。

3.创建数据库

use db_name
db
show dbs

如果数据库不存在,则创建数据库,否则切换到指定数据库。查看当前数据库。最后查看所有数据库,发现并没有刚刚创建的数据库,当往数据库插入数据时,数据库才会真实存在。

  1. 删除数据库 切换到所要删除的数据库下执行 db.dropDatabase()

删除集合(类似数据表)

db.createCollection("name")
db.name.drop()

5.创建集合

db.createCollection(name, options)
# 可选参数, 指定有关内存大小及索引的选项
show collections
show tables
# 查看当前数据库的集合

6.删除集合

db.collection_name.drop()
# 删除当前数据库下,名为collection_name的集合

7.插入文档

db.collection_name.insert(document)
# document文档可视为json格式(字典格式)
document = ({ "title" : "Mongo 教程", "description" : "MongoDB是一个Nosql数据库", "by" : "XXX", "tag" : [ "mongodb", "database", "NoSQL" ] })
# 可以将数据定义为一个变量
db.collection_name.insertOne(document)
# 将一个文档插入集合中
db.collection_name.insertMany([document1,document2])
# 将多个文档插入到集合中
  1. 更新文档 MongoDB更新文档有两种方法:update()  和 save()  方法
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
- query: update的查询条件,类似sql update查询内where后面的。
- update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-writeConcern:可选,抛出异常的级别

save()方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

9.删除文档

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
  1. 查询文档
db.collection.find(query, projection)
- query:可选,使用查询操作符指定查询条件
- projection:可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式:
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)
db.collection.find(query, {title: 1, by: 0}) // 错误

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

db.col.find().pretty()
# 会返回json格式的文档

MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作格式范例RDBMS中的类似语句
等于{<key>:<value>} db.col.find({"key":"value"}).pretty()where key = value
小于{<key>:{$lt:<value>}}db.col.find({"likes":{$lt:50}}).pretty()where likes < 50
小于或等于{<key>:{$lte:<value>}}db.col.find({"likes":{$lte:50}}).pretty()where likes <= 50
大于{<key>:{$gt:<value>}}db.col.find({"likes":{$gt:50}}).pretty()where likes > 50
大于或等于{<key>:{$gte:<value>}}db.col.find({"likes":{$gte:50}}).pretty()where likes >= 50
不等于{<key>:{$ne:<value>}}db.col.find({"likes":{$ne:50}}).pretty()where likes != 50
其中,大于X且小于Y:{likes : {lt:X,lt :X, gt : Y}}

MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。

语法格式如下:

db.col.find({key1:value1, key2:value2}).pretty()

MongoDB OR 条件

MongoDB OR 条件语句使用了关键字  $or,语法格式如下:

db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

AND 和 OR 联合使用

AND 和 OR 的联合使用,类似常规 SQL 语句为:where key>50 AND (key1 = 'value' OR key2 = 'value')

db.col.find({
{
 {key: value}
},//与里面或
   {
      $or: [
         {key1: value1,key2:value2}, {key3:value3}//或里面与
      ]
   }
   }
).pretty()

11.MongoDB Limit与Skip方法,类似SQLAlchemy的用法

db.COLLECTION_NAME.find().limit(NUMBER)
# 返回NUMBER条数据
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
# 跳过指定数量的文档,从第一条开始
db.COLLECTION_NAME.find().skip(10).limit(100)
# 读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)

12.MongoDB 排序

db.COLLECTION_NAME.find().sort({KEY:1})
# sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

13.MongoDB 索引

索引是对数据库表中一列或多列的值进行排序的一种结构

db.collection.createIndex(keys, options)
# Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
  1. MongoDB聚合 aggregate() 方法,不加参数和find()一样查找所有的文档,基本语法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。下面是聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。 下面查看管道的工作流程(图片来自MongoDB官方文档):

image.png 聚合表达式

表达式描述
$sum计算总和
$avg计算平均值
$min获取集合中对应字段值最小的(分组)所有文档
$max获取集合中对应字段值最大的(分组)所有文档
$push将值加入一个数组中,不会判断是否有重复的值
$addToSet将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入
$first根据资源文档的排序获取第一个文档数据
$last根据资源文档的排序获取最后一个文档数据