mongodb基础查询

这篇博客呢主要是写下mongodb的基本查询语法,我也会写下常用的。

1.基础查询

db.test_yu.find({})   //查询test_yu表中的所有文档
db.test_yu.find({"name":"yu"})   //查询test_yu表中的所有name属性为yu的文档

①指定返回字段(第一个参数列表为查询参数,相当于mysql的where。第二个参数为返回字段。1或者true返回,0或者false不返回。_id子弹默认返回,不想它返回,可以手动设置为0去掉它)

db.test_yu.find({},{"name":1,"_id":0}) 返回全部数据中的name属性(文档中有这个属性才能返回)

②查询内嵌格式的文档

db.test_yu.find({"arrays":{"sui":"111","xin":"222"}})  (完全匹配,键名,键值必须完全匹配才行)
效果等同于
db.test_yu.find({"arrays.sui":"111","arrays.xin":"222"})

这里写图片描述

2.查询操作符

"$gt""$gte""$lt""$lte"(分别对应">"">=""<""<=")

我们经常会组合查询

db.test_yu.find({"age":{$lte:50,$gte:20}})
查询test_yu表中年龄大于等20,小于等于50的文档
db.test_yu.find({"storage_time" : {$lt :1495382400000,$gt : 1494777600000}})
还有经常用的就是这种查询在某个时间段内的文档
"$all"
语法: { field: { $all: [ <value> , <value1> ... ] }
匹配那些指定键的键值中包含数组,而且该数组包含条件指定数组的所有元素的文档,数组中元素顺序不影响查询结果。

db.test_yu.find({tags:{$all:["aa","cc"]}});  匹配tags字段中包含aacc的数据(tags键值位数组)

文档中键值类型不是数组,也可以使用$all操作符进行查询操作,如下例所示"$all"对应的数组只有一个值,那么和直接匹配这个值效果是一样的。
db.test_yu.find({tags:{$all:["aa"]}});
等同于
db.test_yu.find({tags:"aa"});

所以如果有多个值的情况用$all会好点,而单个字的话就还是用下面这种普通的查询就好了
"$in"
语法:{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }
匹配键值等于指定数组中任意值的文档。类似sql中in.
db.test_yu.find({tags:{$in:["aa","bb","cc"]}})  查询tags中包含aa或者bb或者cc的文档

还有一种情况下会用到$in,那就是当你想查询出某个字段为空的文档时。
db.test_yu.find({"age":{$in:[null]}})   查询出age值为空的文档



*但是结果中会出现不包含age属性的文档。因为null不仅仅匹配自身,而且匹配键“不存在的”文档,集合众文档都不存在"age"键,都匹配查询条件,所以上面的语句会返回不包括age属性的文档!*

这种情况下,一般都会与"$exists" 一起使用。
db.test_yu.find({age:{$in:[null],$exists:true }})  
这个会查询出age字段存在且键值为null的数据,就不会出现上面的那种情况了,至于$exists操作符下面我会说的
"$exists"   

语法: { field: { $exists: <boolean> } }

  如果$exists的值为true,选择存在该字段的文档;若值为false则选择不包含该字段的文档(我们上面在查询键值为null的文档时使用"$exists"判定集合中文档是否包含该键)。

 db.test_yu.find({event_products:{$exists:true}})

查询文档中event_products字段不为空的文档。

这样我们就能很好的理解上面的那个查询语句了,设置为true,就是要确定文档中存在此字段。然后再去匹配键值为null的值,则就一定是符合我们要求的文档。
 
"$nin"
语法: { field: { $nin: [ <value1>, <value2> ... <valueN> ]} } 

匹配键值 不等于 指定数组的任意值的文档。类似sql中not in(SQL中字段不存在使用会有语法错误).

db.test_yu.find({age:{$nin:[null]}}) 这个查询匹配的就是age字段部位null的文档
"$and"
语法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。$and操作符使用短路操作,若第一个表达式的值为“false”,余下的表达式将不会执行。(短路表现)

db.cloud_compute_event.find({$and:[{event_theme:{$regex:"云"}},{event_subjects:{$regex:"云"}}]})
两个条件且的关系,求两者的交集(我这个里面嵌套的是模糊匹配,你只要动手操作一下,应该就能明白)

等同于
db.cloud_compute_event.find({event_theme:{$regex:"云"},event_subjects:{$regex:"云"}})

对于上面使用逗号分隔符的表达式列表,MongoDB会提供一个隐式的$and操作。

这个就是查询出符合你缩写的全部条件的文档,求交集
"$or"   
语法: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

执行逻辑OR运算,指定一个至少包含两个表达式的数组,选择出至少满足数组中一条表达式的文档。

db.cloud_compute_event.find({$or:[{event_theme:"云123"},{event_subjects:"阿里云"}]})
查询event_name为云123,或者event_subjects为阿里云或者两者都满足的数据

这个操作符,条件之间是或的关系,是求二者的交集。
"$regex"   
操作符查询中可以对字符串的执行正则匹配。 MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式.

我们可以使用正则表达式对象或者$regex操作符来执行正则匹配:

db.cloud_compute_event.find({$and:[{event_theme:{$regex:"云"}},{event_subjects:{$regex:"云"}}]}) 匹配event_theme字段和event_subjects字段都包含云的文档

db.cloud_compute_event.find({event_theme:{$regex:"云"}}) 
db.cloud_compute_event.find({event_theme:{$regex:"云",$options: 'i' }})

$options (使用$regex )

    * i   如果设置了这个修饰符,模式中的字母会进行大小写不敏感匹配。
    * m   默认情况下,PCRE 认为目标字符串是由单行字符组成的(然而实际上它可能会包含多行).如果目标字符串 中没有 "\n"字符,或者模式中没有出现“行首”/“行末”字符,设置这个修饰符不产生任何影响。
    * s    如果设置了这个修饰符,模式中的点号元字符匹配所有字符,包含换行符。如果没有这个修饰符,点号不匹配换行符。
    * x    如果设置了这个修饰符,模式中的没有经过转义的或不在字符类中的空白数据字符总会被忽略,并且位于一个未转义的字符类外部的#字符和下一个换行符之间的字符也被忽略。 这个修饰符使被编译模式中可以包含注释。 注意:这仅用于数据字符。 空白字符 还是不能在模式的特殊字符序列中出现,比如序列 。

  注:JavaScript只提供了i和m选项,x和s选项必须使用$regex操作符。

其他的操作符也有一些,有兴趣的就自己去看吧,上面的这些我感觉是比较基础的,平时应该是比较常用到的

3.其他查询

剩下的就说下limit之类的吧

limit(n) 查询n条符合条件的文档
skip(n)从第n+1文档开始查询 skip属性,一般用于分页
sort({read_cout:-1}) 排序,前面是字段名,后面1代表正序,-1代表倒叙。一般根据时间查最后一条数据用的多点
count() 统计条数

db.test_yu.find({"storage_time" : {$lt :1495382400000,$gt : 1494777600000},"reserved_field":"白沙湖"}).limit(5).sort({read_count:-1});
就想上面这条语句一样,查询在某个时间段内的文档,根据read_count倒叙排列,查询五条
db.test_yu({}).count();
统计test_yu表中共有多少文档数

db.test_yu.find({}).limit(5).skip(2)
跳过前两条,从三条开始查询前五条。

4.结语

之前基本我都不写这块来着,这次写了一点相关代码,发现这种操作符什么的,基本都不知道几个,就发了点时间看了一遍,写下这篇博客。还是眼高手低啊,什么事还是亲手实践下最靠谱、

如果感觉有帮助,帮忙点个赞啊,亲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值