写点什么

四、MongoDB 查询(2)

用户头像
Kylin
关注
发布于: 2021 年 03 月 10 日

4.2 查询条件

查询不仅能像前几篇文章说的那样精确匹配,还能匹配更加复杂的条件,比如范围、OR 子句和取反。


4.2.1 查询条件

"$lt"、"$lte"、"$gt"、"$gte"就是全部的比较操作符,分别对应<、<=、>、>=。将其组合起来可以查找一个范围的值。例如,查询 18~30 岁(含)的用户


db.users.find({"age":{"$gte":18,"$lte":30}})

{ "_id" : ObjectId("60479533c0f55c9a60459fa9"), "age" : 19, "name" : "Jazz" }

{ "_id" : ObjectId("60479541c0f55c9a60459faa"), "age" : 18, "name" : "Jassica" }

{ "_id" : ObjectId("6047954cc0f55c9a60459fab"), "age" : 25, "name" : "Alice" }



范围查询在日期里尤为有用。例如,要查找在 2021 年 1 月 1 日前注册的人

db.users.find({"registered":{"$lt":start}})

{ "_id" : ObjectId("60479818c0f55c9a60459fb1"), "registered" : ISODate("2021-01-01T00:00:00Z") }



可以对日期进行精确匹配,但是用处不大,因为文档中的日期是精确到毫秒的。我们通常是需要得到一天、一周或者一个月的数据,使用范围查询比较有必要。


"$ne"表示“不相等”,能用于所有类型的数据。若是想查询所有名字不为 Joe 的用户,可以这样查询

db.users.find({"name":{"$ne":"joe"}})

{ "_id" : ObjectId("60479533c0f55c9a60459fa9"), "age" : 19, "name" : "Jazz" }

{ "_id" : ObjectId("60479541c0f55c9a60459faa"), "age" : 18, "name" : "Jassica" }

{ "_id" : ObjectId("6047954cc0f55c9a60459fab"), "age" : 25, "name" : "Alice" }

{ "_id" : ObjectId("6047956ec0f55c9a60459fac"), "age" : 32, "name" : "Adam" }


4.2.2 OR 查询

MongoDB 有两种方式进行 OR 查询:“$in”可以查询一个键的多个值;“$or”可以在多个键中查询任意的给定值。"$in"非常灵活,可以指定不同类型的条件和值。

db.users.find({"name":{"$ne":"joe"}})


与"$in"相对的是"$nin",“$nin”将返回与数组中所有条件都不匹配的额文档。


“$in”能对单个键做 OR 查询,接受一个包含所有可能条件的数组作为参数。


4.2.3 $not

“$not”是元条件句,即可以用在任何其他条件之上。“$not”与正则表达式联合使用时极为有用,用来查找那些与特定模式不匹配的文档。


4.2.4 条件语义

比较之前几篇文章的更新修改器和查询文档,会发现以 $开头的键位于在不同的位置。在查询中,“$lt”在内层文档,而更新中“$inc”则是外层文档的键。基本可以肯定:条件语句是内层文档的键,而修改器则是外层文档的键。


有一些“元操作符”也位于外层文档中,比如:“$and”、“$or”和“$nor”。


注意,查询优化器不会对“$and”进行优化,这与其他操作符不同。

用户头像

Kylin

关注

现实的理想主义者 2019.10.08 加入

【坐标】:魔都 【品种】:程序媛 【标签】:技术宅、大吃货 【追求】:改变世界、改变自己 【信条】:每次前进一小步

评论

发布
暂无评论
四、MongoDB查询(2)