一、简介

我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是对$elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素,只返回我们需要的文档的介绍。我们经常在查询条件查询内嵌文档数组时,只需要返回主文档并返回内嵌文档数组中我们只需要的值,而不是把内嵌文档的数组都返回。

二、对数组根据条件查询

$all、$size、$slice、$elemMatch

(1)$all查找数组中包含指定的值的文档

语法:

{ field:{ $all: [ , ... ]}

例子:

db.orders.find({"books":{$all:["java","mongo"]}})

查找books包含java、mongo的文档数据

(2)$size 查找数组大小等于指定值的文档

语法:

{field: {$size: number } }

例子:

>db.orders.find({"books":{$size:2}})

(3)$slice查询数组中指定返回元素的个数

语法:

>db.collect.find({},{field:{$slice: number }})

number 说明:

为正数表示返回前面指定的值的个数:例如1 返回数组第一个

为负数表示返回倒数指定的值的个数:例如-1返回数组倒数第一个

例子:

>db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:1}})

1)$slice可以查询数组中第几个到第几个

语法:

>db.collect.find({},{field:{$slice:[ number1, number2] }})

跳过数组的number1个位置然后返回number2个数

number1说明:

为正数表示跳到指定值的数组个数:例如2 跳到数组第3个

为负数表示跳到指定值的数组倒数个数:例如-2跳到到数组倒数第3个

例子:

>db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:[1,1]}})

跳过books数组第一个元素,现在到数组第二个元素,并返回1个元素

三、对数组内嵌文档查询

我们先保存数据

db. orders.insert([

{

"onumber" : "001",

"date" : "2015-07-02",

"cname" : "zcy1",

"items" :[ {

"ino" : "001",

"quantity" :2,

"price" : 4.0

},{

"ino" : "002",

"quantity" : 4,

"price" : 6.0

}

]

},{

"onumber" : "002",

"date" : "2015-07-02",

"cname" : "zcy2",

"items" :[ {

"ino" : "001",

"quantity" :2,

"price" : 4.0

},{

"ino" : "002",

"quantity" :6,

"price" : 6.0

}

]

}

])

(1)$elemMatch 文档包含有一个元素是数组,那么$elemMatch可以匹配内数组内的元素并返回文档数据

语法:

>{field:{$elemMatch:{ field1:value1, field2:value2,………}}}

例子:

>db.orders.find({"items":{$elemMatch:{"quantity":2}}})

返回quantity为2的文档

也可以这样查询db.orders.find({"items.quantity":2})

(2) $elemMatch可以带多个查询条件

例子:

>db.orders.find({"items":{$elemMatch:{"quantity":4,"ino":"002"}}})

我们查询数组中的quantity等于4并且ino等于002,但是我们就想返回数组中的quantity等于4并且ino等于002的这个文档,并不想把ino等于001等这些无关的文档返回。

(3)$elemMatch 同样可以用在find方法的第二个参数来限制返回数组内的元素,只返回我们需要的文档

例子:

db.orders.find({"onumber":"001"},{"items":{$elemMatch:{"quantity":4,"ino":"002"}},"cname":1,"date":1,"onumber":1})

我们只返回quantity等于4并且ino等于002的文档,无关的文档没有返回,方便我们处理数据,这样也可以节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

java mongo 查询数组_MongoDB查询(数组、内嵌文档)相关推荐

  1. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】

    一.介绍 MONGODB 的表结构 很灵活 .主要还是因为 字段中可以包含 [ 数组].[内嵌文档]. 现在简单介绍一下 字段中的[ 数组].[内嵌文档]相关的一些操作 (为了方便理解,还是以表来理解 ...

  2. mongodb对数组元素及内嵌文档进行增删改查操作(转)

    from:https://my.oschina.net/132722/blog/168274 比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: &l ...

  3. MongoDB内嵌文档查询

    MongoDB内嵌文档查询 示例数据结构 [{"name": "lisa", "age": 17,"friends": ...

  4. mongodb查询内嵌文档

    mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XXX.insert({"id":1, "members":[{&qu ...

  5. mongodb 查询内嵌文档

    原文:http://www.cnblogs.com/silentjesse/p/3598399.html mongodb查询内嵌文档 假设有这样一个文档: db.XXX.remove(); db.XX ...

  6. spring mongodb内嵌文档查询

    spring mongodb内嵌文档查询 代码示例 简化写法 spring mongodb内嵌文档查询示例. {"name": "zsParent", &quo ...

  7. mongodb java 内嵌文档_MongoDB 内嵌文档

    MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子 ...

  8. MongoDB进阶-内嵌文档查询

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded), ...

  9. mongoDb内嵌文档的数据查询

    导读 本文档主要讲述在内嵌文档中数据的筛选,内容如下 - 获取内嵌文档某特定数据 - 获取多个内嵌文档的某特定数据 - 获取多层级内嵌文档中的某特定数据 - 获取内嵌文件特定数据,并利用排序和分页筛选 ...

最新文章

  1. 时间复杂度,O(1), O(n), O(logn), O(nlogn) 的区别+样例分析
  2. golang exec.Command 执行命令 返回详细错误信息
  3. mysql repo_centos7下使用wget命令安装mysql
  4. 设计模式(10)-装饰模式详解(易懂)
  5. 狄德罗效应下,小程序被“逼”向中心化
  6. mysql -存储过程的学习
  7. 基于sympy的python实现三层BP神经网络算法
  8. 个人工作室的网站开发规范V1.0
  9. 12年前的 Linux bug 复活,DNS 缓存投毒攻击重现
  10. iOS 应用状态详解
  11. vscode调试时如何在launch.json中添加环境变量
  12. 坦克大战游戏java代码_Java实现坦克大战游戏的源码示例
  13. VMware虚拟机安装Ubuntu20.04详细图文教程
  14. 外贸常用术语_对外贸易常用的贸易术语有几种?分别是,,,
  15. CUDA 编程 __launch_bounds__的应用方法
  16. BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔
  17. 使用CAD圆和多边形内、外接圆命令绘制图形。使用CAD多线段命令绘制图形
  18. 沈阳市养老保险停保单如何打印,停保变动通知单的打印方法
  19. 导向滤波(guided Image Filtering)
  20. springmvc--sso单点登录cas统一身份认证器

热门文章

  1. Linux ln命令、软链接和硬链接的区别
  2. “javax.servlet.http.HttpServlet“ 错误
  3. [Python]小甲鱼Python视频第026课(字典:当索引不好用时2)课后题及参考解答
  4. StackExchange.Redis 官方文档(六) PipelinesMultiplexers
  5. oracle sqlldr (一) 最基本语法
  6. metric learning -- 马氏距离与欧氏距离
  7. 【转】php利用mkdir创建多级目录
  8. WIN2003设完C盘权限后终端连不上。
  9. 设计模式之开放封闭原则
  10. mongodb分片概念和原理-实战分片集群