1.入门
1.简介
①.名词和sql的对应关系: 文档(用面向对象的方式对待数据,没有固定的模式schema)/行 集合/表 数据库/数据库 实例/实例
②.mongo优势:高效写/高集群可扩展性(可以使用多台性能低的设备)/保留了sql基本功能(索引\聚合) conn.1.⑥
③.sql优势:对多行事务的支持/复杂查询(联表查询)
2.支持的数据类型
| BSON Type编号 | 名称 | Shell写法 | 用途说明 |
|---|---|---|---|
| 1 | double | x: 3.14 | 64位浮点数(默认JS数字类型) |
| 2 | string | “abc” | UTF-8字符串 |
| 3 | object | { x: 1 } | 内嵌文档 |
| 4 | array | [1,2,3] | 数组 比如说一个人有多个手机号 |
| 5 | binary | BinData(0, “…”) | 二进制数据 图片 |
| 7 | ObjectId | ObjectId(“…”) | MongoDB 默认主键类型 |
| 8 | bool | true/false | 布尔值 |
| 9 | date | ISODate(“…”) | 日期时间 |
| 10 | null | null | 空值 |
| 11 | regex | /pattern/i | 正则表达式 |
| 16 | int32 | NumberInt(123) | 32 位整数 |
| 18 | int64 | NumberLong(1234567890) | 64 位整数 |
| 19 | Decimal128 | NumberDecimal(“123.456”) | 高精度浮点(常用于金融) |
| 127 | maxKey | MaxKey() | 用于排序比较最大值 |
| 255 | minKey | MinKey() | 用于排序比较最小值 |
①._id: 在集合范围内唯一,[0,3]:时间戳(秒) [4,6]:机器标识(host hash) [7,8]进程ID [7,11]:计数器(秒级自增)
②.数值: Mongo Shell是基于JavaScript运行的,如果用db.test.insert({x:2^31}),x超出int32的范围则会被存入为double
db.test.insert({x:NumberLong(“2^31”)}) 可以指定为int64存储
③.数组: 如果对数据类型是数组的字段创建索引,mongo是对数组里面的每一个元素创建索引
④.内嵌文档: 和mysql的外键(在mongo叫拆集合)处理的业务相同,内嵌文档的优势:更加的紧凑 缺点:反范式(冗余)
2.增删改
1.增
db.users.insert({"name": "baz"}) # 驱动程序会将数据转换成BSON,数据库校验BSON内是否有_id且文档大小是否超过4MB2.删
db.users.remove() # 删除集合内所有文档 不会删除集合和索引
db.drop_collection("users") # 删除集合3.改
①.update
var joe = db.user.findOne({"name":"joe"})
joe.relationships = {"friends":3,"enemies":3} # 可以是不同数据类型
db.users.update({"name":"joe"}, joe)②.修改器
$set # 更新文档中的某个字段,如果不存在则创建
$inc # 和redis的incrby效果一致
$push # 往文档的数组字段中加入一个元素
$ne # 判断数组中是否有某个元素
$addToset # 避免重复,如果数组里面有该元素则不插入
$each # 和$push $addToSet配合使用,单次插入多个元素③.如果数组里面没有该email则插入 使用$ne
db.users.update(
{"emails": {"$ne": "newemail@example.com"}}, # 不建议使用,非线程安全
{$push: {"emails": "newemail@example.com"}}
)④.如果数组里面没有该email则插入 使用$addToSet
db.users.update(
{ _id: ObjectId("4b2d75476cc613d5ee930164") },
{
$addToSet: {
email: "newemail@example.com"
}
}
)⑤.如果数组里面没有该email s则插入 使用$addToSet $each
db.users.update(
{_id: ObjectId("4b2d75476cc6130d5ee930164")},
{
$addToSet: {
"emails": {$each: ["newemail@example.com", "another@example.com"]}
}
}
)文档更新时间: 2026-03-31 19:26 作者:morninglu
