暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MongoDB 的简单使用

焱萱Crystal 2020-12-25
248

MongoDB 是面向文档
的数据库

MongoDB 以文档的方式存取记录,一条记录如下所示:

{"name""Jackson""age": 18}
{"name""Jackson""age""18"}
{"Name""Jackson""age": 18}

注意:

  1. 以上是两个不同的文档,MongoDB 区分大小写的数据类型。第一个 age 类型是数字类型
    ,第二个 age 是字符串
    类型。
  2. 每一个文档
    (相当于 mysql 的记录 row)的尺寸不能超过 16M
    。并且每一个文档都有一个 _id
    字段,且同一集合中的 _id
    值唯一,该字段可以是任意类型
    的数据,默认是一个 ObjectId
    对象。ObjectId
    占位 12
如:{"_id":ObjectId("52ffc4a5d85242602e000001"),"name":"Jackson","age":18}
01234567891011
时间戳:0 1 2 3   
机器:4 5 6
PID:7 8
计数器:9 10 11
由上述四个组合生成的 ObjectId
MongoDB 默认监听端口:27017 和 28017

MongoDB 的增、删、改、查

一、插入数据

例 1:向 student 数据库的 user 集合中插入一个文档:

// 切换到 student 数据库
use student
// 向集合 user 中插入一条文档
db.user.insert({"name""Jackson""age": 18})

插入数据流程:

  1. 客户端检查数据是否超常、是否非 utf8
    字符。
  2. 客户端将数据转成 BSON
    的形式,然后送入服务器。
  3. 服务器解析 BSON
  4. 检验是否含 "_id"
    键。
  5. 检验文档不超过 16M
  6. 放入数据库。

MongoDB 支持的数据类型: null、布尔、32 位整数、64 位整数、64 位浮点数、字符串、对象 id、日期、正则表达式、代码、二进制数据(视频文件)、undefined、数组、内嵌文档。

二、删除数据

例 1:将 student 数据库的 user 集合中 年龄等于 10 的文档都删除

// 切换到 student 数据库
use student
// 删除 user 集合中年龄等于 10 的文档
db.user.remove({"age":10})

注意:remove
只是删除记录,集合和索引还在
db.drop_collection("user")
会删除整个集合和索引,速度很快。

三、修改数据

语法:update(条件,数据,是否新增,是否修改多条)

例 1 :将 student 数据库的 user 集合中 年龄等于 10 的修改为 20

// 切换到 student 数据库
use student
// 找出一条年龄为 10 的文档并赋予给变量 u
var u = db.user.findOne({"age": 10})
// 在原文档上将年龄为 10 修改为 20 
u.age = 20
db.user.update({"age": 10},u) 或 db.user.save(u)

注意:Upsert:如果没有满足查询条件的记录,则是否新创建这条记录。

例 2 :使用修改器修改

$inc: 加一个数字
$set: 修改某一个字段, 如果该字段不存在则加一个这个字段
$push: 向数组中添加
$pop: 从数组的首或尾取出数据

// 切换到 student 数据库
use student

// 把 Jackson 的年龄加 2
db.user.update({"name":"Jackson"},{"$inc":{"age":2}})

// 将 Jackson 的电话号码修改为 1234567, 如果没有这个字段就新增
db.user.update({"name":"Jackson"},{"$set":{"tel":"1234567"}})

修改数据容易出错的地方

例 3 :将原文档里的年龄修改为 20

原文档:({"_id": 1, "name":"Jackson""age":18, "sex":"male"})

错误示范:
var u = db.user.update({"_id":1}, {"age": 20}) 
// 修改完之后的结果
({"_id":1, "age":20})

正确示范:
// 找出id为 1 的文档并赋予给变量 u
var u = db.user.find({"_id": 1})
// 在原文档上将年龄 10 修改为 20 
u.age = 20
db.user.update({"_id": 1},u) 或 db.user.save(u)
// 修改完之后的结果
({"_id": 1, "name":"Jackson""age":20, "sex":"male"})

MongoDB 中的更新、修改、删除
都是瞬间完成
的,即:客户端执行命令时,直接把命令传给服务器且不等待返回结果
就接着处理下一条命令。如果要查询命令是否执行成功
,则用命令:db.runCommand({getLastError: 1})
来查询。

四、查询数据

语法:find(查询条件,返回的键)

查询操作符
$gt     // 大于
$gte    // 大于等于
$lt     // 小于
$lte    // 小于等于
$ne     // 不等于
$eq     // 等于
$in     // 在 ... 范围之内
$nin    // 不在 ... 范围之内
$mod    // 取模
$exists // 判断键是否存在
$where  // 根据函数返回值来判断
$or 
$not 

例 1 : 查询年龄小于 20 的学生

db.user.find({"age":{"$lt":20}})

例 2 : 判断值为 null

// 不仅查出了值为 null, 且 name 键不存在的文档也会被取出来 
db.user.find({"name":null})

// name 键存在, 值为 null
db.user.find({"name": null, "$exists":1})

例 3 : 取出年龄 乘以 2+5 且小于 100 的数据

db.user.find({"$where":function(){
    return ((this.age * 10 + 5) < 100);
}})

this:  表示当前这个文档
$where: 可以实现任意类型的查询, 但是查询速度比较慢,一般不建议使用

限制与聚合

limit   // 限制文档条数
skip    // 忽略前 N 条文档
sort    // 排序 1(升序), -1(降序)
count   // 文档数

例 4 : 取出前 20 个学生,并且根据年龄降序排序

db.user.find({"type":"student"}).limit(20).sort({"age":-1})
// 查询总数据
db.user.find().count() 


文章转载自焱萱Crystal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论