MongoDB查询(数组、内嵌文档)

摘要:
我们经常在查询条件查询内嵌文档数组时,只需要返回主文档并返回内嵌文档数组中我们只需要的值,而不是把内嵌文档的数组都返回。}}}例子:[sql]viewplaincopy˃db.orders.find返回quantity为2的文档也可以这样查询db.orders.find$elemMatch可以带多个查询条件例子:[sql]viewplaincopy˃db.orders.find我们查询数组中的quantity等于4并且ino等于002,但是我们就想返回数组中的quantity等于4并且ino等于002的这个文档,并不想把ino等于001等这些无关的文档返回。

转自:http://blog.csdn.net/congcong68/article/details/46919227

一、简介

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

二、对数组根据条件查询

$all、$size、$slice、$elemMatch

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

语法:

{ field:{ $all: [ <value> , <value1> ... ]}

MongoDB查询(数组、内嵌文档)第1张

例子:

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

MongoDB查询(数组、内嵌文档)第2张

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

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

语法:

  1. {field:{$size:number}}

例子:

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

MongoDB查询(数组、内嵌文档)第3张

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

语法:

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

number 说明:

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

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

例子:

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

MongoDB查询(数组、内嵌文档)第4张

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

语法:

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

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

number1说明:

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

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

例子:

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

MongoDB查询(数组、内嵌文档)第5张

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

三、对数组内嵌文档查询

我们先保存数据

  1. <spanstyle="font-size:18px;">
  2. db.orders.insert([
  3. {
  4. "onumber":"001",
  5. "date":"2015-07-02",
  6. "cname":"zcy1",
  7. "items":[{
  8. "ino":"001",
  9. "quantity":2,
  10. "price":4.0
  11. },{
  12. "ino":"002",
  13. "quantity":4,
  14. "price":6.0
  15. }
  16. ]
  17. },{
  18. "onumber":"002",
  19. "date":"2015-07-02",
  20. "cname":"zcy2",
  21. "items":[{
  22. "ino":"001",
  23. "quantity":2,
  24. "price":4.0
  25. },{
  26. "ino":"002",
  27. "quantity":6,
  28. "price":6.0
  29. }
  30. ]
  31. }
  32. ])</span>

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

语法:

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

例子:

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

MongoDB查询(数组、内嵌文档)第6张

返回quantity为2的文档

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

MongoDB查询(数组、内嵌文档)第7张

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

例子:

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

MongoDB查询(数组、内嵌文档)第8张

我们查询数组中的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})

MongoDB查询(数组、内嵌文档)第9张

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

免责声明:文章转载自《MongoDB查询(数组、内嵌文档)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Visual Studio 14 初试,vNextMacOS的包管理神器homebrew使用入门教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java中将字符串用空格分割成字符串数组的split方法

官方文档链接:public String[] split(String regex) 本文以空格作为分割串。 CaseOne import java.util.Scanner; public class CaseOne { public static void main(String[] args) { Scanner sc = new Scan...

PHP7革新与性能优化

有幸参与2015年的PHP技术峰会(PHPCON),听了鸟哥(惠新宸)的关于PHP7的新特性和性能优化的分享,一切都令人感到激动。鸟哥是国内最权威的PHP专家,他的分享有很多非常有价值的东西,我通过整理分享的PPT和收集相关资料,整理为这篇解读性质的技术文章,希望能给做PHP开发的同学一些帮助。 PHP已经走过了20年的历史,直到今天,PHP7都发布了R...

关于JavaScript的数组随机排序

昨天了解了一下Fisher–Yates shuffle费雪耶兹随机置乱算法,现在再来看看下面这个曾经网上常见的一个写法: functionshuffle(arr) { arr.sort(function() { return Math.random() - 0.5; }); } 或者使用更简洁的 ES6 的写法: funct...

php Array

1. 创建数组 创建一个包含指定范围的数组   array range( mixed low, mixed high [, number step]); 基于变量创建一个数组   array compact( mixed varname [, mixed…]);   extract(array &array) 将数组解析为变量 2. 计算数组大小...

【ES6】迭代器与可迭代对象

ES6 新的数组方法、集合、for-of 循环、展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现。本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方法 一、迭代器的原理 在编程语言中处理数组或集合时,使用循环语句必须要初始化一个变量记录迭代位置,而程序化地使用迭代器可以简化这种数据操作 如何设计一个迭代器...

Java内存优化和性能优化的几点建议

1.没有必要时请不用使用静态变量     使用Java的开发者都知道,当某个对象被定义为stataic变量所引用,这个对象所占有的内存将不会被回收。有时,开发者会将经常调用的对象或者变量定义为static,以便提高程序的运行性能。因此,不是常用到的对象或者变量,不要定义为static类型的变量,尤其是静态类对象的定义,一定要仔细考虑是否有必要。例如  ...