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.
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
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索引相关的博客
等不及的看官可以自行百度Google一下。
最后,点个推荐呗,谢谢!!!
MongoDB操作符之$elemMatch的更多相关文章
- mongodb操作符
1."$gt" ."$gte". "$lt". "$lte"."null查询"."$all ...
- MongoDB $type条件操作符
描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...
- MongoDB 学习笔记(8)---$type 操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1 String 2 Object 3 ...
- MongoDB $type 操作符
描述 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 数字 备注 Double 1 String 2 Object 3 ...
- 【翻译】MongoDB指南/CRUD操作(一)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...
- MongoDB学习笔记——文档操作之查询
查询文档 使用db.COLLECTION_NAME.findOne()可以查询所有满足条件的第一条数据 预发格式如下: db.COLLECTION_NAME.findOne(<query> ...
- MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...
- kityminder-editor + MongoDB 思维导图数据自动实时保存方案
最近开始做自己的第一个开源项目:一个基于思维导图的测试用例管理系统MinderCase,在做了一周的技术调研后,决定采用kityminder-editor作为思维导图编辑器,为了支持实时存储,当思维导 ...
- mongodb的学习-6-命令简单使用
1.创建数据库 use DATABASE_NAME 举例说明: > use another //创建了数据库another switched to db another > db anot ...
随机推荐
- JasperReport框架使用教程(附带常见空白页问题说明)
概述与安装使用 1. PDF报表概述 概述 在企业级应用开发中,报表生成.报表打印下载是其重要的一个环节.在之前的课程中我们已经学习了报表中比较重要的一种:Excel报表.其实除了Excel报表之 ...
- JMeter-临界部分控制器
前言 临界部分控制器根据锁名来控制并发,同一个锁名之下,在同一时间点只能存在一个运行中,适用于控制并发的场景 锁名类型: 锁名为空,认为每个锁为不同的锁 锁名相同,多个锁认为是同一个锁,同一个时间点只 ...
- CentOS7 部署K8S集群,最新版1.17.3-0
小白在网上找了很多关于k8s集群部署的文档,但是版本老旧,到处踩坑,终于部署成功,记录下过程. 一.准备工作 虚拟机:VMware® Workstation 15 Pro Xhell 6:Xshell ...
- python中excel数据分组处理
1.场景描述 因文本相似性热度统计(python版)需求中要根据故障类型进行分组统计,需要对excel进行分组后再分词统计,简单记录下,有需要的朋友可以直接拿走,不客气! 2.解决方案 采用panda ...
- 初识Arduino
Arduino是一款便捷灵活.方便上手的开源电子原型平台.包含硬件(各种型号的Arduino板)和软件(Arduino IDE).由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Ba ...
- 7-35 jmu-python-求三角形面积及周长 (10 分)
输入的三角形的三条边a.b.c,计算并输出面积和周长.假设输入三角形三边是合法整形数据. 三角形面积计算公式: ,其中s=(a+b+c)/2. import math #导入math库 math.s ...
- Vue双向绑定的实现原理系列(三):监听器Observer和订阅者Watcher
监听器Observer和订阅者Watcher 实现简单版Vue的过程,主要实现{{}}.v-model和事件指令的功能 主要分为三个部分 github源码 1.数据监听器Observer,能够对数据对 ...
- Android html5 控制video currentTime不准确,精确,解决办法。
早在flash时代 我们控制视频播放指定时间位置的画面也会有不准确的情况, 具体情况表现为:video.seek(time) 而实际画面会跳到此时间附近(1-2秒)的画面 而HTML5 我们通过 ...
- 伪元素 before 和 after 初探
伪元素 before 和 after 初探 使用了 CodePen 做演示,欢迎点击预览 定义 首先来看 MDN 的定义: ::before 创建一个伪元素,作为已选中元素的第一个子元素,常通过 co ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...