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 ...
随机推荐
- react ReactDOMServer
此文章是翻译ReactDOMServer这篇React(版本v15.4.0)官方文档. ReactDOMServer 如果你用script 标签来使用React,这些顶级APIs 将会在全局React ...
- loadrunner通过web的post请求方法测接口
loadrunner通过web的post请求方法测接口 loginapi() 模拟APP发送请求给Cloud, Action() "Name=input","Value= ...
- sofa-bolt源码阅读(1)-服务端的启动
Bolt服务器的核心类是RpcServer,启动的时候调用父类AbstractRemotingServer的startup方法. com.alipay.remoting.AbstractRemotin ...
- 基于@vue/cli 的构建项目(3.0)
1.检测node的版本号 注意:1.Vue CLI需要Node.js的版本 8.9+(推荐8.11.0+) 所以在安装Vue CLI之前先看下node的版本 node -v 2.安装@vue/cli ...
- js的立即执行函数
立即执行函数:常用于第三方库,好处在于隔离作用域,任何一个第三方库都会存在大量的变量和函数,为了避免变量污染(命名冲突),一般想到的方法就是使用立即执行函数.jQuery就是使用的立即执行函数. 函数 ...
- (28)ASP.NET Core AutoMapper组件
1.什么是AutoMapper? AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作.使AutoMapper变得有趣的是,它提供了一些有 ...
- AX2012/D365 SSRS报表开发
大家好,好久没有做SSRS报表了,近期刚好有做2张,就整理起来供初学者参考. AX中SSRS报表开发的框架,父类非常多,这里跟大家简单分享2种比较常用的场景供大家使用. 1.简单的过滤字段,无特殊过滤 ...
- 树莓派3B+远程VNC的设置
现在很少有自带VNCserver的教程,因为之前官方系统没有自带VNC,但是现在最新版的官方系统已经自带VNCserver,只需要在设置里启用一下,然后设置就可以用啦. 1.打开树莓派设置 sudo ...
- 个人项目作业(wc.exe)
1.GitHub项目地址 https://github.com/QiuBin666/WC 项目介绍: 题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行 ...
- C++ 随笔练习 求和
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int ...