赞
踩
(1)特点:
(2)Mongo与MySQL概念区别:
SQL概念 | MongoDB概念 |
---|---|
database | database |
table | collection |
row | document |
column | field |
SQL概念 | MongoDB概念 |
---|---|
primary key | _id |
foreign key | reference |
view | view |
index | index |
join | $lookup |
transaction | trasaction |
group by | aggregation |
挑几个介绍下:
1、_id 主键:保证文档的唯一性。
2、reference 引用:勉强可以对应于 外键(foreign key) 的概念,之所以是勉强是因为 reference 并没有实现任何外键的约束,而只是由客户端(driver)自动进行关联查询、转换的一个特殊类型
3、$lookup,这是一个聚合操作符,可以用于实现类似 SQL-join 连接的功能
4、transaction 事务,从 MongoDB 4.0 版本开始,提供了对于事务的支持
5、aggregation 聚合,MongoDB 提供了强大的聚合计算框架,group by 是其中的一类聚合操作
分布式ID生成规则:
MySQL中著名的 snowflake 算法中就同时使用了时间戳、机器号、进程号以及随机数来保证唯一性。
MongoDB 采用 ObjectId 来表示主键的类型,id 的生成规则如下:
_id 的生成实质上是由客户端(Driver)生成的。服务端也会检测写入的文档是否包含_id 字段,如果没有就生成一个。
(1)简介:JSON 有自己的短板,比如无法支持像日期这样的特定数据类型,因此 MongoDB 实际上使用的是一种扩展式的JSON
(2)BSON 所支持的数据类型包括:
(3)一个典型的文档如下:
- {
- "_id": 1,
- "name" : { "first" : "John", "last" : "Backus" },
- "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
- "awards" : [
- {
- "award" : "W.W. McDowell Award",
- "year" : 1967,
- "by" : "IEEE Computer Society"
- }, {
- "award" : "Draper Prize",
- "year" : 1993,
- "by" : "National Academy of Engineering"
- }
- ]
- }

使用 wiredTiger (B+树)作为默认的引擎
用法:
(1)ensureIndexes 为集合声明一个普通的索引(author后面的数字 1 代表升序,如果是降序则是 -1)
db.book.ensureIndex({author: 1})
(2)复合式(compound)的索引(只有对于复合式索引时,索引键的顺序才变得有意义)
db.book.ensureIndex({type: 1, published: 1})
(3)数组(multikey)索引(索引的字段是数组类型,该索引就自动成为数组索引)
db.book.ensureIndex({tags: 1})
MongoDB不存在SOL语句,操作它,需要使用ORM语法
(1)创建数据库
和一般的关系型数据库一样,都要建立一个自己的数据库空间
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库,如果你想查看所有数据库,可以使用 show dbs
(2)删除数据库(删除当前数据库)
db.dropDatabase()
(3)创建集合(建表)
db.createCollection(name, options)
参数说明:
例子:在 test 数据库中创建 runoob 集合:
- > use test
- switched to db test
- > db.createCollection("runoob")
- { "ok" : 1 }
- >
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
(4)删除集合
db.collection.drop()
(5)插入文档
使用 insert() (不推荐)或 save() (新版已废弃)方法向集合中插入文档
- db.COLLECTION_NAME.insert(document)
- 或
- db.COLLECTION_NAME.save(document)
insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据
db.collection.insertOne():向集合插入一个新文档
- db.collection.insertOne(
- <document>,
- {
- writeConcern: <document>
- }
- )
示例:插入一条数据(官方推荐)
db.course.insertOne({"name":"linux","price":1070})
db.collection.insertMany() :用于向集合插入一个多个文档
- db.collection.insertMany(
- [ <document 1> , <document 2>, ... ],
- {
- writeConcern: <document>,
- ordered: <boolean>
- }
- )
示例:插入多条数据(官方推荐)
db.course.insertMany({"name":"linux","price":1070},{"name":"nodejs","price":1090})
参数说明:
(6)查询文档
主要是(find、 findOne),这里没有findMany
示例:
ind()无条件查询:将该表(collection)中所有的数据一次性返回:
db.course.find()
条件查找:price等于1070的数据,这里会返回多条结果:
db.course.find({"price":1070})
findOne():无条件查找一条数据,默认当前collection中的第一条数据
db.course.findOne()
条件查找一条price等于1070的数据,如果有多条数据则返回更靠前的数据:
和MySQL的Where 语句比较:
操作 | 格式 | 范例 | MySQL中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } | db.col.find({"by":"xx"}).pretty() | where by = 'xx' |
小于 | {<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 |
AND 条件: find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件
>db.col.find({key1:value1, key2:value2}).pretty()
示例:通过 by 和 title 键来查询 xxx中 MongoDB 教程 的数据
> db.col.find({"by":"xxx", "title":"MongoDB 教程"}).pretty()
OR 条件:使用了关键字 $or
- >db.col.find(
- {
- $or: [
- {key1: value1}, {key2:value2}
- ]
- }
- ).pretty()
示例:查询键 by 值为 xxx 或键 title 值为 MongoDB 教程 的文档
>db.col.find({$or:[{"by":"xxx"},{"title": "MongoDB 教程"}]}).pretty()
AND 和 OR 联合使用:
示例:要实现 SQL 语句为: 'where likes>50 AND (by = 'xxx' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "xxx"},{"title": "MongoDB 教程"}]}).pretty()
关键字 | 说明 |
---|---|
$or | 或关系 |
$nor | 或关系取反 |
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | 在多个值范围内 |
$nin | 不在多个值范围内 |
$all | 匹配数组中多个值 |
$regex | 正则,用于模糊查询 |
$size | 匹配数组大小 |
$maxDistance | 范围查询,距离(基于LBS) |
$mod | 取模运算 |
$near | 邻域查询,查询附近的位置(基于LBS) |
$exists | 字段是否存在 |
$elemMatch | 匹配内数组内的元素 |
$within | 范围查询(基于LBS) |
$box | 范围查询,矩形范围 |
$center | 范围查询,圆形范围 |
$centerSphere | 范围查询,球形范围 |
$slice | 查询字段集合中的元素(比如从第几个之后,第N到第M个元素) |
(1)查询某个字段不为空的数据:
db.getCollection('tableName').find({'xx':{$ne:null}})
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。