首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

MongoDB学习 (6):查询

2013-08-04 
MongoDB学习 (六):查询本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html??欢迎转

MongoDB学习 (六):查询

本文地址:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html??欢迎转载 ,请保留此链接??? ????!

本文将介绍操作符的使用,配合操作符,我们可以执行更加复杂的操作。

目录查询操作
    集合查询方法 find()查询内嵌文档查询操作符(内含 数组查询)"$gt" 、"$gte"、 "$lt"、 "$lte"、"null查询"、"$all"、"$size"、"$in"、"$nin"、"$and"、"$nor"、"$not"、"$or"、"$exists"、"$mod"、"$regex"、"$where"、"$slice"、"$elemMatch"

?

?1.1 集合查询方法 find()

db.collection.find() ?查询集合中文档并返回结果为游标的文档集合。

在第二个参数中,指定键名且值为1或者true则是查询结果中显示的键;若值为0或者false,则为不显示键。文档中的键若在参数中没有指定,查询结果中将不会显示(_id例外)。这样我们就可以灵活显示声明来指定返回的键。

我们在使用RDMS时,有时会对表中多个字段之间进行比较。如表store中,有销售数量soldnum和库存数量stocknum两个字段,我们要查询表中销售数量等于库存数量的记录时可以使用下面的sql语句:

内嵌文档的完全匹配查询和数组的完全匹配查询一样,内嵌文档内键值对的数量,顺序都必须一致才会匹配:

//无任何返回值> db.profile.find({ name : {  last : "Obama" , first : "Barack"} });>

推荐采用针对键/值对查询,通过点表示法来精确表示内嵌文档的键:

});//或者db.profile.find({ "name.last" : "Obama" , "name.first" : "Barack"} );

运行结果:

MongoDB学习 (6):查询

?

?

査询文档可以包含点,来表达“深入内嵌文档内部”的意思,点表示法也是待插入的文档不能包含的原因。当内嵌文档变得复杂后,如键的值为内嵌文档的数组,内嵌文档的匹配需要些许技巧,例如使用$elemMatch操作符。

集合blogs有如下文档:

, "comment" : [ { "author" : "zhangsan", "score" : 3, "comment" : "shafa!" }, { "author" : "lisi", "score" : 5, "comment" : "lzsb!" } ]}

我们想查询评论中用户“zhangsan”是否有评分超过4分的评论内容,但我们利用“点表示法”直接写是有问题的,这条查询条件和数组中不同的文档进行了匹配!

上面的结果不是我们期望的,下面使用“$elemMatch”操作符即可将一组条件限定到数组中单条文档的匹配上:

?

?

?

?

?1.3 查询操作符

下面我们将配合查询操作符来执行复杂的查询操作,比如元素查询、 逻辑查询 、比较查询操作。

我们使用下面的比较操作符"$gt" 、"$gte"、 "$lt"、 "$lte"(分别对应">"、 ">=" 、"<" 、"<="),组合起来进行范围的查找。例如查询年龄为16-18岁(包含16但不含18)的用户:

$in"判断键值是否为null,"$exists"判定集合中文档是否包含该键。

? 我们也可以运行如下语句:

但是当为我们运行下面语句时,发现查询结果跟语句"db.users.find({birthday:{$in:[null],$exists:true }})"不一样!

? 因为null不仅仅匹配自身,而且匹配键“不存在的”文档,集合众文档都不存在"birthday"键,都匹配查询条件,所以上面的语句会返回所有的文档!

我们最好使用db.users.find({sex:{$in:[null],$exists:true }})这种格式。

?

下面先向集合inventory插入3条数据(下面的演示基于此数据),文档内容如下:

{"name":"t2","amount":50,"tags":[ "appliances", "school", "book" ]}
{"name":"t3","amount":58,"tags":[ "bag", "school", "book" ]}

MongoDB学习 (6):查询

?"$all"

匹配那些指定键的键值中包含数组,而且该数组包含条件指定数组的所有元素的文档,数组中元素顺序不影响查询结果。

appliances、school、?book元素的所有文档:

该查询将匹配tags键值包含如下任意数组的所有文档:

查询结果:

MongoDB学习 (6):查询

",tags键值数组包含四个元素,所以不匹配查询条件。查询结果:

MongoDB学习 (6):查询

$size必须制定一个定值,不能接受一个范围值,不能与其他查询子句组合(比如"$gt")。但有时查询需求就是需要一个长度范围,这种情况创建一个计数器字段,当你增加元素的同时增加计数器字段值。

MongoDB学习 (6):查询

?

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

db.inventory.find({ name: "t1" , amount: { $lt:50 }} )

MongoDB学习 (6):查询

?"$nor"

执行逻辑NOR运算,指定一个至少包含两个表达式的数组,选择出都不满足该数组中所有表达式的文档。

MongoDB学习 (6):查询

?

若是文档中不存在表达式中指定的键,表达式值为false; false nor false 等于 true,所以查询结果返回集合中所有文档:

?

"$not"

执行逻辑NOT运算,选择出不能匹配表达式的文档 ,包括没有指定键的文档。$not操作符不能独立使用,必须跟其他操作一起使用(除$regex)。

  查询条件中的键gty,文档中都不存在无法匹配表示,所以返回集合所有文档数据。

?

"$or"?

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

MongoDB学习 (6):查询

?

"$exists"???

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

如果该字段的值为null,$exists的值为true会返回该条文档,false则不返回。

? ?

"$mod" ?

匹配字段值对(divisor)取模,值等于(remainder)的文档。

?

有些情况下(特殊情况键值为null时),我们可以使用$mod操作符替代使用求模表达式的$where操作符,因为后者代价昂贵。

MongoDB学习 (6):查询

注意:返回结果怎么不一样。因为有一条文档的amount键值为null,javascript中null进行数值转换,会返回"0"。所以该条文档匹配$where操作符求模式了表达式。当文档中字段值不存在null,就可以使用$mod替代$where的表达式.

?

"$regex"

操作符查询中可以对字符串的执行正则匹配。 MongoDB使用Perl兼容的正则表达式(PCRE)库来匹配正则表达式.

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

$options (使用$regex )

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

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

?

"$where"

操作符功能强大而且灵活,他可以使用任意的JavaScript作为查询的一部分,包含JavaScript表达式的字符串或者JavaScript函数。

新建fruit集合并插入如下文档:

})db.fruit.insert({"apple":3, "banana": 3, "peach" : 4})

比较文档中的两个键的值是否相等.例如查找出banana等于peach键值的文档(4种方法):

?

查出文档中存在的两个键的值相同的文档,JavaScript函数会遍历集合中的文档:

注意:我们尽量避免使用"$Where"査询,因为它们在速度上要比常规査询慢很多。每个文档都要从BSON转换成JavaScript对象,然后通过"$where"的表达式来运行;同样还不能利用索引。

?

"$slice (projection)"?

$slice操作符控制查询返回的数组中元素的个数。

"array"键将返回从指定数量的元素。如果count的值大于数组中元素的数量,该查询返回数组中的所有元素的。

$slice接受多种格式的参数 包含负数和数组:

?

?

热点排行