(MongoDB)与SQL查询语句对比

2023年 9月 6日 77.1k 0

一、背景介绍:

一句话介绍:

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"}}) 其余操作符:Ps:字符串类型用操作符比较的字典序
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: "

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论