千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下MongoDB操作符中$elemMatch问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!问
千家信息网最后更新 2026年11月02日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安全错误 数据库的锁怎样保障安全 瑰夏咖啡 科技互联网政务服务 疫情对互联网科技公司影响 上海互联网科技有限公司 互联网科技金融公司 九亚互联网科技 深圳齐家互联网科技 郑州华宇互联网科技 科技类的互联网平台 银川新华互联网科技学校联系电话 浙南科技城互联网大厦建设工程 互联网科技的全部知识 四川慕妮娅互联网科技有限公司 互联网数据科技专业 互联网科技公司营业执照怎么办理 上海互联网科技公司ppt 西安有哪些互联网高科技企业 福建互联网展示科技馆设计 云鲸互联网络科技有限公司 三亚科技创新互联网基地 广州万易互联网科技有限公司 互联网是不是新科技 互联网科技金融公司 长亮科技 互联网金融 互联网金融科技委员会 北京三清互联网科技 常德市电业局互联网科技部 半导体行业属于互联网高科技类吗 绵阳真晨互联网科技有限公司 互联网科技对化妆品行业
0