MongoDB 查询技巧(1) - 字段相等

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB 查询技巧(1) - 字段相等相关的知识,希望对你有一定的参考价值。

参考技术A 在工作中有时遇到这么一种场景 找出那些字段A和字段B相等的数据
刚开始只能想到自己联表查自己,后面研究了一下,发现了更简单的方法,分享出来

假设我们有以下测试数据

是一张 暗恋表 ,有人喜欢别人,有人自恋
我们现在想要 找出那些自恋的人

lookup语法

根据语法和常规思路,我们写下了如下查询

( $unwind 是用来拍平数据结构的,因为联表之后,嵌套字段是一个列表)

查询之后发现 结果为空
嗯?我们把 match 删了看一下结果是啥

可以看到,联表的确是生效了,但是我们要找的是 自恋 , 而不是 有人爱 ,
联表之后还差一步,就是找到 name 等于 love_yourself.name 的记录
但是,等等,貌似又回到了最初的问题: 找到字段相等的数据
所以,联表也遇到同样的问题,也就是联表并没有解决这个问题,所以此路不通

然后在官方文档的 query 里面找啊找,发现了 expr 的操作,例子很有意思

然后我想,我把 gt 换成 eq 行不行呢
把查询语句换一下

结果如下

bingo! 可以了

这个问题暂时解决了,但是平时工作中,经常遇到 ObjectId 和 String 互相匹配的问题
那么在这种场景下,语句如何写呢?

我们准备好测试数据

值一样的,标记为了同一个颜色

我们先来试一下,思路不变,能不能查出来(语句有变化,字段换成了 _id )

很遗憾,不能

此时还是在 expr 的文档里看到了这么一个例子

很明显, $expr 的 参数列表,参数类型可以是 转换函数,不一定就需要是老老实实的字段, 如图中就是用了 $cond 作为条件函数来转换字段,
那么我把 ObjectId 转为 String 类型的是不是就可以了呢
来试一下以下的查询语句

结果如下

OK,这个场景也解决了

以上是关于MongoDB 查询技巧(1) - 字段相等的主要内容,如果未能解决你的问题,请参考以下文章

java 如何查询mongodb字段名称?

MongoDB 查询技巧(3) - 数组操作

mongoDB_08索引的操作

怎么判断mongodb objectid类型数据的值和某个字符串相等

数据库mongodb和mysql的对比

非 ACID RethinkDB 或 MongoDB 如何维护非相等查询的二级索引