四、MongoDB 查询(2)
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”进行优化,这与其他操作符不同。
评论