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操作符之$elemMatch内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MongoDB 管道的介绍及操作符实例

    MongoDB 管道的介绍及操作符实例 一 介绍 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数. MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理.管道操作是可以重复的. 表达式:处理输入文档并输出.表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档. 这里我们介绍一下聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档. $m

  • 基于MongoDB数据库的数据类型和$type操作符详解

    前面的话 本文将详细介绍MongoDB数据库的数据类型和$type操作符 类型 数字 备注 Double 1 双精度浮点数 - 此类型用于存储浮点值 String 2 字符串 - 这是用于存储数据的最常用的数据类型.MongoDB中的字符串必须为UTF-8 Object 3 对象 - 此数据类型用于嵌入式文档 Array 4 数组 - 此类型用于将数组或列表或多个值存储到一个键中 Binary data 5 二进制数据 - 此数据类型用于存储二进制数据 Undefined 6 已废弃 Objec

  • MongoDB操作符中的$elemMatch问题

    问题 如果MongoDB 数据库集合中仅存在一条记录 { "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"), "name" : "赵小明", "used_name" : [ "赵明", "赵小朋" ], "age" : 16, "gender" : 0, "relatives&q

  • python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中

    爬取TOP500的音乐信息,包括排名情况.歌曲名.歌曲时间. 网页版酷狗不能手动翻页进行下一步的浏览,仔细观察第一页的URL: http://www.kugou.com/yy/rank/home/1-8888.html 这里尝试将1改为2,再进行浏览,恰好是第二页的信息,再改为3,恰好是第三页的信息,多次尝试发现不同的数字即为不同的页面.因此只需更改home/后面的数字即可.由于每页显示的为22首歌曲,所以总共需要23个URL. import requests from bs4 import B

  • MongoDB集合中的文档管理

    上一博客写了集合的管理,集合里面存放的是文档,因此聪明的你应该能想到这篇是学习文档管理.要说标题应该是文档管理,不过对于文档的管理都是先获得集合对象,在集合对象上调用方法管理文档,所以标题还是对集合的管理. 在集合管理中,要管理集合首先要获得这个集合,同样文档管理也是要先获得集合对象,然后通过集合对象管理文档. 一.将文档添加到集合中 为什么要先说添加呢,因为不添加就没法说下面的查找.将文档添加到一个集合中,首先需要得到集合对象,通过几个对象调用insert(document)或save(doc

  • MongoDB数据库中索引和explain的使用教程

    前言 本文主要给大家介绍了关于MongoDB中索引和explain使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: mongodb 索引使用 作用 索引通常能够极大的提高查询. 索引是一种数据结构,他搜集一个集合中文档特定字段的值. B-Tree索引来实现. 创建索引 db.collection.createIndex(keys, options) keys keys由文档字段和索引类型组成.如{"name":1} key 表示字段 value 1,-1 

  • MongoDB数据库中索引(index)详解

    索引:特殊的数据结构,存储表的数据的一小部分以实现快速查询 优点: 1.大大减少了服务器需要扫描的数据量 2.索引可以帮助服务器避免排序或使用临时表 3.索引可以将随机io转换为顺序io 索引评估:三星(非常好) 一星:索引如果能将相关的记录放置到一起 二星:索引中数据的存储顺序与查找标准中顺序一致 三星:如果索引中包含查询中所需要的全部数据:(覆盖索引) DBA书:关系型数据库索引设计与优化 索引类别: 顺序索引 散列索引:将索引映射至散列桶上,映射是通过散列函数进行的 评估索引的标准: 访问

  • MongoDB中的加减乘除运算详解

    前言 很多同学因为对MongoDB不熟悉,加之应用的不是很多,有时候会认为MongoDB数据库对一些功能不支持,或者认为支持不好.今天我们 演示一下 MongoDB对"加减乘除"的使用. 在MongoDB数据库中"加减乘除"运算,又称为 数学表达式(mathematical expression:或算术表达式),主要用于操作数值. 1.$add操作符(+) 1.1 语法及功能介绍 $add 操作符主要用于将一组数字相加:也可以用于在指定时间上添加一定的时间间隔.时间

  • MongoDB中数据的替换方法实现类Replace()函数功能详解

    近日接到一个开发需求,因业务调整,需要DBA协助,将MongoDB数据库中某集合的进行替换.例如我们需要将集合A中B字段中,有关<美好>的字符替换为 <非常美好>.个人感觉这个需求如果是在SQL Server 或MySQL 数据库上处理是小菜一碟,如果是针对MongoDB数据,可能要费神了. 1.常见关系数据数据库中的替换函数 在SQL Server数据库中,我们用Replace函数来实现字符的替换. 语法 REPLACE ( ''string_replace1'' , ''str

  • MongoDB中的一些坑(最好不要用)

    MongoDB 是目前炙手可热的 NoSQL 文档型数据库,它提供的一些特性很棒:如自动 failover 机制,自动 sharding,无模式 schemaless,大部分情况下性能也很棒.但是薄荷在深入使用 MongoDB 过程中,遇到了不少问题,下面总结几个我们遇到的坑.特别申明:我们目前用的 MongoDB 版本是 2.4.10,曾经升级到 MongoDB 2.6.0 版本,问题依然存在,又回退到 2.4.10 版本. MongoDB 数据库级锁 坑爹指数:5星(最高5星) MongoD

  • Python中使用Flask、MongoDB搭建简易图片服务器

    1.前期准备 通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python 调教 mongodb 了. 接着安装个 flask 用来当 web 服务器. 当然 mongo 也是得安装的. 对于 Ubuntu 用户, 特别是使用 Server 12.04 的同学, 安装最新版要略费些周折, 具体说是 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo '

  • NodeJS中的MongoDB快速入门详细教程

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 一.MongoDB必须理解的概念 1.数据库:每个数据库都有自己的权限和集合. 2.文档:一个键值对. 3.集合:一组文档,即一组键值对.当第一个文档插入时,集合就会被创建. 二.Mac下的MongoDB安装和启动 1.使用brew进行安装:brew ins

随机推荐