MongoDB 是面向文档
的数据库
MongoDB 以文档的方式存取记录,一条记录如下所示:
{"name": "Jackson", "age": 18}
{"name": "Jackson", "age": "18"}
{"Name": "Jackson", "age": 18}
注意:
以上是两个不同的文档,MongoDB 区分大小写的数据类型。第一个 age 类型是 数字类型
,第二个 age 是字符串
类型。每一个 文档
(相当于 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})
插入数据流程:
客户端检查数据是否超常、是否 非 utf8
字符。客户端将数据转成 BSON
的形式,然后送入服务器。服务器解析 BSON
。检验是否含 "_id"
键。检验文档不超过 16M
。放入数据库。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




