您好,欢迎访问一九零五行业门户网

MongoDB查询迷题(1)

本文来自 mongodb 核心开发人员@kchodorow 的博文,是其关于 mongodb 查询迷题的第一篇,通过几个例子介绍了在array 中进行范围查询的一些查询规则和用法。 假如一个 collection 中有下面一些数据: {x: -5}{x: 0}{x: 5}{x: 10}{x: [0, 5]}{x: [
本文来自 mongodb 核心开发人员@kchodorow 的博文,是其关于 mongodb 查询迷题的第一篇,通过几个例子介绍了在array 中进行范围查询的一些查询规则和用法。
假如一个 collection 中有下面一些数据:
{x: -5}{x: 0}{x: 5}{x: 10}{x: [0, 5]}{x: [-5, 10]}{x: [-5, 5, 10]}
如果我们在这个 collection 上执行下面的查询语句,会返回哪些数据呢?
db.foo.find({x : {$gt : -1, $lt : 6}})
结果如下:
{x : 0}{x : 5}{x : [0, 5]}{x : [-5, 10]} //这货也被查出来了!!{x : [-5, 5, 10]}
上面红色注释一条,其两个元素都满足大于-1小于6的条件,为什么还是被查出来了呢?让我们来看看 mongodb 在 array 上进行范围查询的原理吧。
mongodb 在进行范围查询时,可以理解为是按各个条件进行对比的,对于上面有疑问的一行,其 array 中的 -5 是小于 6 的,而 10 是大于 ?-1 的,所以系统会认为这一行同时满足这两个条件(因为系统内部不管是不是 array 的同一个元素满足这两个条件)。
如果要在同一个元素上满足各个条件,那么我们可以使用 $elemmatch 算符,比如我们将上面的查询语句做一下修改,会得到下面的结果:
> db.foo.find({x: {$elemmatch: {$gt : -1, $lt : 6}}}){x : [0, 5]}{x : [-5, 5, 10]}
上面红色有疑问的那一条数据已经没有了,但是等一下,还有两条数据也跟着没有了,这是什么原因呢?丢失的两条数据是下面这两条:
{x: 0}{x: 5}
可以看到,这两条的共同特点,是其 x 对应的 value 值并不是一个 array。这就是为什么这两条会丢掉的原因,因为 $elemmatch 算符只会对 array 进行筛选,如果值根本就不是一个 array,会被直接视为不满足条件。
上面两个查询方法,条有条的原理,但是都没有得到预期的结果,那有没有什么方法可以得到预期的查询结果呢?答案是肯定的,这时候我们要结合 min() 和 max() 两个方法。
先说一下 min() 和 max() 两个方法,这两个方法作用于 mongodb 查询的 cursor,它可以对 mongodb 在查询中使用索引的方式进行指导,min(-1) 的意思是,mongodb 在使用此索引的时候,只使用大于 -1 部分的索引,而 max(6) 的意思是,mongodb 在使用此索引的时候,只使用小于 6 部分的索引。比如我们使用下面的方式,就能够成功过滤掉上面红色有疑问的一行数据了。
> db.foo.find({x : {$gt : -1, $lt : 6}}).min({x : -1}).max({x : 6}){x : 0}{x : [ 0, 5 ]}{x : 5}{x : [ -5, 5, 10 ]}
have fun!
原文参考:www.kchodorow.com
42区 vps
42qu.com 云主机 , 卖给创业的你 。 点击这里 ,
warning: call_user_func_array() expects parameter 1 to be a valid callback, function 'embed_rssfooter' not found or invalid function name in /home/b55/htdocs/blog.nosqlfan.com/wp-includes/plugin.php on line 166
其它类似信息

推荐信息