MongoDB查询迷题(1)

php中文网
发布: 2016-06-07 16:29:30
原创
1187人浏览过

本文来自 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 云主机 , 卖给创业的你 。 点击这里 , 查看详情

MongoDB查询迷题(1)
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
MongoDB查询迷题(1)
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号