Mongodb 常用的查询方法

本文介绍了MongoDB中常用查询方法,包括基本的比较运算符、特殊运算符如$exists和$not,以及如何处理数组和嵌套对象的查询。通过具体的示例展示了如何使用这些查询方法进行高效的数据检索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着NoSql的越来越火,Mongodb 作为NoS ql的代表,用的人也越来越多。学习Mongodb 有一段时间了,项目中使用还行,但是在使用remongo这个工具是每次书写查询语言还是感觉很不习惯。所以总结了下Mongodb 中常用的查询方法:

1,大于,小于,大于等于,小于等于

$gt 大于   >

$lt 小于    <

$gte 大于或等于  >=

$lte  小于等于     <=

示例

db.collection.find({age:{$gt:18}});  //年龄大于18岁,不包含18SQL:SELECT * FROM Collection WHERE age>18



db.collection.find({age:{$lt:25}});  //年龄小于25岁,不包含25SQL:SELECT * FROM Collection WHERE age<25



db.collection.find({age:{$gte:18}});//年龄大于等于18岁的,包含18SQL:SELECT * FROM Collection WHERE age >=18



db.collection.find({age:{$lte:25}});//年龄小于等于25岁的,包含25SQL:SELECT * FROM Collection WHERE age<=25



也可以将两个条件合并,如下

db.collection.find({age:{$gt:18,$lt:25}}) ;//18<age<25;



2,不等于

$ne 不等于 noe equals

db.collection.find({age:{$ne:18}})  ;//年龄不等于18



3in,not in

$in,$nin


语法

db.collection.find({field:{$in:array}});

db.collection.find({field:{$nin:array}});

示例:

db.collection.find({id:{$in:[1,2,3,4]}})

db.collection.find({id:{$nin:[1,2,3,4]}});



4,$exists 验证一个元素是否存在

这个语法有点绕

db.collection.find({title:{$exists:true}});  //如果记录中有包含title属性的全部返回

db.collection.find({title:{$exists:false}}); //如果记录中有包含title属性的全部不返回,不包含title属性的全部返回



5,正则表达式

mongo支持正则表达式,如:

db.customers.find( { name : /acme.*corp/i } ); // 后面的i的意思是区分大小写

支持正则表达式查询让mongDb具有相当强大的查询功能,不过同时需要开发者比较了解正则表达式



6  查询数据内的值

下面的查询是查询colors内red的记录,如果colors元素是一个数据,数据库将遍历这个数组的元素来查询。db.things.find( { colors : "red" } );

7 $elemMatch

如果对象有一个元素是数组,那么$elemMatch可以匹配内数组内的元素:

> t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } ) 
{ "_id" : ObjectId("4b5783300334000000000aa9"), 
"x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]
}$elemMatch : { a : 1, b : { $gt : 1 } } 所有的条件都要匹配上才行。

注意,上面的语句和下面是不一样的。

> t.find( { "x.a" : 1, "x.b" : { $gt : 1 } } )
$elemMatch是匹配{ "a" : 1, "b" : 3 },而后面一句是匹配{ "b" : 99 }, { "a" : 11 } 



8  查询嵌入对象的值

db.postings.find( { "author.name" : "joe" } );

注意用法是author.name,用一个点就行了。更详细的可以看这个链接: dot notation

举个例子:

> db.blog.save({ title : "My First Post", author: {name : "Jane", id : 1}})

如果我们要查询 authors name 是Jane的, 我们可以这样:

> db.blog.findOne({"author.name" : "Jane"})

如果不用点,那就需要用下面这句才能匹配:

db.blog.findOne({"author" : {"name" : "Jane", "id" : 1}})

下面这句:

db.blog.findOne({"author" : {"name" : "Jane"}})

是不能匹配的,因为mongodb对于子对象,他是精确匹配。



9 元操作符 $not 取反

如:

db.customers.find( { name : { $not : /acme.*corp/i } } );db.things.find( { a : { $not : { $mod : [ 10 , 1 ] } } } ); 

后续项目中的查询方法再慢慢添上

### MongoDB 性能调优方法与技巧 #### 使用性能监控工具 为了更好地理解系统的瓶颈并采取相应的措施,可以利用多种内置的性能监控工具。`mongostat` 和 `mongotop` 是两个常用的命令行工具,分别用于统计操作频率和资源占用情况[^1]。此外,启用 Profiler 或者通过 `db.currentOp()` 查看当前运行的操作状态也是诊断性能问题的有效手段。 #### 创建合适的索引 索引对于提升查询效率至关重要。应根据实际应用场景设计复合索引、TTL(Time-to-Live)索引或者地理空间索引等特殊类型的索引结构。需要注意的是,过多的索引可能会增加写入成本,因此要平衡读取速度与写入开销之间的关系[^3]。 #### 文档模型的设计优化 文档嵌套程度及字段布局直接影响到访问路径长短以及磁盘I/O次数。合理规划集合内的数据组织形式能够减少跨文档关联带来的额外负载。同时也要注意单个文档尺寸不宜过大以免降低缓存命中率。 #### 调整分片策略 当单一实例难以承载海量数据时,则需考虑引入Sharding机制来扩展存储容量上限。选择恰当的关键字作为shard key有助于均匀分布各节点上的工作负荷,并避免热点分区现象的发生。 #### Oplog 大小调整 在副本集环境中,适当增大 oplog 的容量可以帮助次级成员更长时间保留历史变更记录从而顺利完成初始化同步过程而不至于因日志丢失而导致全量恢复必要性提高的情况发生[^4]。 #### 内存配置管理 由于 WiredTiger 存储引擎采用 LSM 树结构,默认情况下会尽可能多地把热数据驻留在 RAM 中以便快速响应客户端请求。所以建议依据业务特点预留充足物理内存给 mongod 进程使用,同时也可以修改 cacheSizeGB 参数控制其具体数值范围。 ```javascript // 设置WiredTiger Cache Size var config = { storage : {wiredTiger:{engineConfig:{cacheSizeGB:8}}} }; db.adminCommand(config); ``` #### 自动优化功能的应用 最新版本MongoDB具备了一些自动化的后台改进流程比如Index Intersection, Query Optimizer Plan Caching等功能,在无需人为干预前提下即可完成部分复杂场景下的效能增强任务[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值