一、背景介绍:
一句话介绍:
MongoDB与SQL常用查询语句对比文档
详细介绍:
主要用于记录MongeDB与SQL常用查询语句的对比,方便查询与简单学习。若有笔误 or 缺漏,欢迎评论补充。
文档数据库(MongoDB)介绍
MongoDB
-
优点:速度快,分片,易扩展,没有schema带来的灵活,分布式
-
缺点:数据大小有限制,不能无限嵌套,高内存,不支持业务复杂查询
-
适用场景
- 希望直接存储复杂struct或json格式的数据,不希望拆分成多个item的需求
- 大尺寸、低价值数据存储:因为存储便宜
- 高伸缩性场景
-
不适合的场景
- 高度事务性系统: 传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
- 有比较复杂的查询
二、常用查询语句对比:
MongoDB 基本查询的通用方式 :
db.表名.find({},{}).功能
第一个{} 为条件查询
第二个{} 为返回的列 {字段名:1}
功能 : sort(字段:1) | skip(num) | limit(num) | count()
1.1 简单查询对照表:
名称 | SQl语句 | ByteDoc ( MongoDB )语句 | 备注 |
---|---|---|---|
1. 全查询(查询全部字段信息) | select * from people | db.people.find() | |
2. 精准查询(查询部分字段信息) | SELECTobject_id, room_idFROM people | db.people.find( {}, { "object_id" : 1, "room_id" : 1 , "_id" : 0 }) | 1表示该字段显示,0表示不显示,比如这儿默认会返回主键"_id"信息,如果不想要就可以赋值为0。 |
3. 条件查询(查询符合条件的全字段数据) | SELECT *FROM peopleWHERE status = "yes" | db.people.find({ status: "yes" }) | 只使用第一个花括号时,第二个可以省略。此时为全查询。 |
4. 条件+精准查询(查询符合条件的数据并显示部分字段) | SELECTobject_id, room_idFROM people WHERE status = "yes"AND ab_cluster ****= 1 | db.people.find({ status: "yes" , "ab_cluster" : 1 },{"object_id" : 1, "room_id" : 1 }) | |
5. 符号条件查询(不等于、大于、小于,存在(in)等符号条件查询) | SELECT *FROM peopleWHERE status != "yes" | 不等于 db.people.find({ "status": { ne: "yes"}})大于 : db.people.find({"status":{gt : "yes"}})大于等于 : db.people.find({"status":{gte : "yes"}})小于 : db.people.find({"status":{lt : "yes"}})小于等于 : db.people.find({"status":{$lte : "yes"}}) | 其余操作符:![]() |
6. 或 查询(查询满足部分条件的数据) | SELECT *FROM peopleWHERE status = "yes"OR ab_cluster ****= 1 | db.people.find({ $or: [ { "status" : "yes" } , { "ab_cluster" : 1 } ] }) | 与 查询见4 |
7.1 模糊查询(查询object_id包含“1234”的数据) | SELECT *FROM peopleWHERE object_id like "%1234%" | db.people.find( { object_id: /1234/ } )或者db.people.find( { object_id: { $regex: /1234/ } } ) | |
7.2模糊查询(查询object_id以“1234”开头的数据) | SELECT *FROM peopleWHERE object_id like "1234%" | db.people.find( { object_id: /^1234/ } )或者db.people.find( { object_id: { $regex: /^1234/ } } ) | |
8.1 排序:升序(按照创建时间升序查询数据) | SELECT *FROM peopleWHERE status = "yes"ORDER BY create_time ASC | db.people.find( { status: "yes" } ) .sort( { "create_time": 1 } ) | |
8.1 排序:降序(按照创建时间降序查询数据) | SELECT *FROM peopleWHERE status = "yes"ORDER BY create_time DESC | db.people.find( { status: "yes" } ) .sort( { "create_time": -1 } ) | |
9. 统计(查询年龄大于30的数据数量) | SELECT COUNT(*)FROM peopleWHERE age > 30 | db.people.count( { age: { gt: 30 } } )或者db.people.find( { age: { gt: 30 } } ).count() | 注意花括号数量和匹配关系。 |
10. 限制数据数量(跳过5条,查询10条数据) | SELECT *FROM peopleLIMIT 10OFFSET 5 | db.people.find().limit(10).skip(5) | 删除.skip(5) 就是查询前十条数据 |
11. 去重(查询数据,当room_id相同时只保留一条) | SELECT DISTINCT(room_id)FROM people | db.people.aggregate( [ { group: {_id: "enpool.ab_cluster",count: { $sum: "1" }}}] ) | group中的_id指定了字段,即按照这个字段分组 |
4. 分组后排序(按照ab实验类型分组计数后根据数量升序排序) | SELECT _id,SUM( enpool.ab_cluster) AS countFROM tableGROUP BY enpool.ab_clusterORDER BY count | db.table.aggregate( [{group: {_id: "enpool.ab_cluster",count: { $sum: "1" }}}] ) | 交换了聚合的顺序就实现了先排序后分组,所以聚合操作的顺序特别重要! |
6. 分组前筛选+分组后筛选(分组前筛选状态为“yes”的数据,分组后筛选总数大于250的数据) | SELECT cust_id,SUM(enpool.ab_cluster) AS countFROM tableWHERE status = 'yes'GROUP BY enpool.ab_clusterHAVING count > 250 | db.table.aggregate( [{ match: { status: 'yes' } },{group: {_id: "
|