千家信息网

MongoDB操作符中$elemMatch问题的示例分析

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,小编给大家分享一下MongoDB操作符中$elemMatch问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问
千家信息网最后更新 2025年01月20日MongoDB操作符中$elemMatch问题的示例分析

小编给大家分享一下MongoDB操作符中$elemMatch问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

问题

如果MongoDB 数据库集合中仅存在一条记录

{  "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"),  "name" : "赵小明",  "used_name" : [     "赵明",     "赵小朋"  ],  "age" : 16,  "gender" : 0,  "relatives" : [     {      "name" : "赵刚",      "relationship" : 0    },     {      "name" : "秀英",      "relationship" : 1    }  ]}

我们执行查询

db.getCollection('Persion').find({"relatives.name": "赵刚", "relatives.relationship": 1})

此时会得到结果吗?

最开始我想当然的以为是不会出现结果的,但结果往往与期望背道而驰。

什么,一瞬间我陷入了迷茫,Mongo的查询结果不是必须都满足所有条件的吗?

分析

不信邪的我又尝试了喜闻乐见的小白查询

db.getCollection('Persion').find({"name": "赵小明", "age": 18})

这次结果为空,嗯,这才是我熟悉的Mongo嘛?

那这两次查询有啥区别呢?不同有两点

  • 是否为二级字段

  • 是否为数组

那我们将数据改为

{  "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"),  "name" : "赵小明",  "used_name" : [     "赵明",     "赵小朋"  ],  "age" : 16,  "gender" : 0,  "relative" : {    "name" : "赵刚",    "relationship" : 0  }}

继续执行查询

db.getCollection('Persion').find({"relatives.name": "赵刚", "relatives.relationship": 1})

此次结果为空集

接下来尝试查询

db.getCollection('Persion').find({"relatives.name": "赵刚", "relatives.relationship": 0})

此次可得到一条结果

通过上述两次查询基本可以排除二级字段的影响

那就是数组的原因了,那具体是为什么呢?

将数据还原为最初的格式,继续进行不同的查询

db.getCollection('Persion').find({"relatives.name": "赵刚", "relatives.relationship": 2})

此次结果为空集

那我们可以得到结论,对于数组字段,每个查询条件仅需有数组中的一项满足条件即可,而不是数组中必须存在一项满足所有查询条件。

那如果我想达到后面的效果要怎么做呢?

解决

此时,我们需要用到我们今天的主角 $elemMatch ,它的官方定义是这样的:

The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.

{ : { $elemMatch: { , , ... } } }
If you specify only a single condition in the $elemMatch expression, you do not need to use $elemMatch.

You cannot specify a $where expression in an $elemMatch.
You cannot specify a $text query expression in an $elemMatch.

那上边的查询我们可以改成

db.getCollection('Persion').find({"relatives":{"$elemMatch":{"name": "赵四", "relationship": 0}}})

此时可以得到结果,但

db.getCollection('Persion').find({"relatives":{"$elemMatch":{"name": "赵四", "relationship": 1}}})

结果为空集

以上是"MongoDB操作符中$elemMatch问题的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

查询 结果 赵刚 数组 条件 问题 分析 字段 数据 篇文章 小明 空集 操作符 示例 不同 内容 赵明 尝试 迷茫 喜闻乐见 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全法41条规定 软件开发的生命周期模型阶段 相关网络安全技术发展现状 服务器数据库备份管理制度 广州凡科网络技术有限公司 软件开发用苹果还是外星人 电信架设服务器国外无法访问 花网络安全手抄报简笔画 云替代存储设备和服务器吗 云时代数据库 服务器电脑有什么用 无限法则哪个服务器比较好 单招计算机网络技术面试 数据库 安全机制 总结 东莞市浩嘉网络技术有限公司 重大网络安全泄露事件 网络安全检测评估工具 怎么做手机软件开发公司 科技互联网公司起名 合肥视觉工控机服务器 计算机网络技术的专业能力 部落冲突怎么转回国内服务器 泰州第十代i5服务器 服务器3代cpu是什么架构 四川中丹量子软件开发有限公司 网络服务器租金是多少 华为主要网络技术 数据库学号前后不能有空格 疫情防控国家网络安全 istudywin软件开发
0