MongoDB的查询
admin
2023-04-12 08:03:42
0

    MongoDB使用find来查询,不指定任何参数说明是对整个集合的文档查询。

  1. find查询

    指定返回的键

    有时并不需要将文档中所有键值对都返回,可以通过find(或者findOne)的第二个参数来制定想要的键,这样即会节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。

例如:

> db.people.find()

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

    如果只对name和age感兴趣,可以这样查询:

> db.people.find({"name":"joe","age":21})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

>

    但是"_id"总是被返回,即便没有指定。

    可以使用第二个参数来剔除查询结果中的某个键值对,例如,如果不希望显示"friends" : 32的键值对:

> db.people.find({},{"friends":0})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

    也可以用来防止返回"_id":

> db.people.find({"age":21},{"_id":0})

{ "name" : "joe", "age" : 21 }

2、查询条件

    查询不仅能精确匹配,还能匹配更加复杂的条件,比如范围,OR子句或者取反。

2.1、查询条件

    查询条件的比较操作符:

"$lt"  对应 <

"$lte" 对应<=

"$gt"  对应>

"$gte" 对应>=

"$ne"  对应“不相等”

> db.people.find({"age":{"$gte":30,"$lte":50}})

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

> db.people.find({"age":{"$ne":65}})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

    "$ne" 用于所有数据的类型。

2.1、OR查询

    有两种方式进行OR查询。

    "$in":可以用于查询一个键的多个值;

    "$or":完成多个键值的任意给定值。

2.1.1"$in"

    对于单一键要是有多个值与其匹配的话,就要用"$in"加一个条件数组:

> db.people.find({"age":{"$in":[21,49,65]}})

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d08fbd0eb7b5f5718da82c"), "name" : "joe", "age" : 49 }

>

    "$in"非常灵活,可以指定不同类型的条件和值:

> db.people.insert({"age":"kkk"})

WriteResult({ "nInserted" : 1 })

> db.people.find({"age":{"$in":[21,"kkk"]}})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

    要是"$in"对应的数组只有一个值,那么和直接匹配这个值的效果是一样的。

> db.people.find({"age":{"$in":[21]}})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

> db.people.find({"age":21})

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

>

2.1.1"$nin"

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

> db.people.find({"age":{"$nin":[21,49,65]}})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

2.1.1"$or"

       "$or"接受一个包含所有可能条件的数组作为参数:

> db.people.find({"$or":[{"age":"kkk"},{"friends":32}]})

{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

    同时"$or"可以包含其他条件句:

> db.people.find({"$or":[{"age":"kkk"},{"friends":32},{"age":{"$in":[21,65]}}]})


{ "_id" : ObjectId("54d08a1d0eb7b5f5718da828"), "name" : "joe", "friends" : 32,

"enemies" : 2 }

{ "_id" : ObjectId("54d08f7f0eb7b5f5718da82a"), "name" : "joe", "age" : 65 }

{ "_id" : ObjectId("54d08fb70eb7b5f5718da82b"), "name" : "joe", "age" : 21 }

{ "_id" : ObjectId("54d334cbb174be28d017c1a6"), "age" : "kkk" }

>

    AND型的查询,总是尽可能地用最少的条件来限定结果的范围;而OR型的查询则相反,第一个条件尽可能地匹配更多的文档,这样才是最高效的。


相关内容

热门资讯

徐巧芯剖析赖清德:最怕自己丢掉... 海峡导报综合报道 大罢免投票一周年纪念活动26日举行,台北市长蒋万安出席并怒轰,民进党一年过后仍没有...
中国红十字会总会紧急向广东调拨... 记者从中国红十字会总会了解到,针对台风“红霞”给广东造成的灾情,中国红十字会总会启动四级应急响应,紧...
这些少年,正被“毒蛋”围猎 李梦抽了几口电子烟,吐出了白色的烟雾,有一股浓烈的水果香味。随后,她看着自己握电子烟的手,跟身边人说...
蒋万安号召“倒阁”,卢秀燕认为... 海峡导报综合报道 台北市长蒋万安27日抛出震撼议题,表示多名民代向他提议推动“倒阁”,要求台行政机构...
特朗普将在白宫会见两位重要客人 俄乌战争仍未结束,美伊冲突又有升级风险。在此背景下,美国总统特朗普将在白宫接见乌克兰和以色列领导人。...
新租客打扫卧室柜子上掉落4万元... 近日,莲前西路某小区内,张倩签下一套房子的租赁合同。当天上午,她带着12岁的大女儿周馨怡和11岁的小...
六部门通告:禁止涉军队退役报废... 关于禁止涉军队退役报废装备销售活动的通告近年来,部分经营者在线上线下公开销售涉及我军退役报废装备(指...
九寨沟景区发生泥石流,部分道路... 7月26日,九寨沟风景名胜区管理局发布泥石流灾害通报:2026年7月26日15时50分,九寨沟景区局...
空调26度不凉是什么原因 从空调内部元器件来说,不凉的原因有可能是温度传感器出现故障了,也有可能是空调压缩机或者铜管出现问题,...
鲸鸿动能携手香港国际机场、鸿蒙...   2026 年 7 月 25 日,十余位鸿蒙车主组成的车队从珠海出发,经港珠澳大桥通关抵达香港国际...