一、简介

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

二、对数组根据条件查询

 $all、$size、$slice、$elemMatch

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

语法:

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

例子:

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个元素

三、对数组内嵌文档查询

我们先保存数据

  1. <span style="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可以匹配内数组内的元素并返回文档数据

语法:

         >{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的文档,无关的文档没有返回,方便我们处理数据,这样也可以节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

学习MongoDB 五: MongoDB查询(数组、内嵌文档)(二)的更多相关文章

  1. MongoDB-4: 查询(二-数组、内嵌文档)

    一.简介 我们上一篇介绍了db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段,我们今天介绍了对数组和内嵌文档的查询操作,尤其是 ...

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

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

  3. mongodb查询内嵌文档

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

  4. MongoDB对数组元素及内嵌文档进行增删改查操作

    比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: {    "_id" : "195861",    &qu ...

  5. MongoDB查询或修改内嵌文档

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

  6. mongodb内嵌文档的查询

    本文转自:http://blog.163.com/wm_at163/blog/static/1321734902012526103825481/ 1 > db.blog.findOne() { ...

  7. MongoDB 内嵌文档

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

  8. mongodb内嵌文档的javaapi,增删改查

    数据结构: {"_id" : "000000001",  //Mongodb默认主键 "UID" : "000000001&quo ...

  9. MongoDB内嵌文档操作

    实体定义: [BsonIgnoreExtraElements] public class Person : BaseEntity { public string FirstName { get; se ...

随机推荐

  1. android中的两种上下文区别

    1.this    继承于content      子类 2.getAppliCationContext()     返回值为context    父类 父类有的子类都有,子类父类不一定有. 在对话框 ...

  2. git中的bug分支和Feature分支

    /*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 如果对于分支还不太明白的学者.请先参考:http://www.cnblogs.com/zengsf/p/7512 ...

  3. 会声会影X7安装不了,总是提示已经安装其他版本,怎么办

    会声会影X7安装不了,总是提示已经安装其他版本,怎么办 卸载c++2008,安装会声会影,ok. 卸载工具:Windows Install Clean Up

  4. MySQL主从数据库配置

    使用工具 MySQL数据版本:5.6.36-log. 两台云服务器(Linux系统) 首先,需要在Linux系统下安装MySQL,具体步骤可以参考这里,并且确保两台主机可以相互访问,可以直接ping一 ...

  5. HDU 5499:SDOI

    SDOI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  6. 写个简单的chrome插件-京东商品历史价格查询

    说chrome插件编写的先关文章, 首推小茗的[干货]Chrome插件(扩展)开发全攻略. 有非常完善的理论,引用和demo代码. 但是还是建议看官方的 chrome extensions. chro ...

  7. JAVA爬取百度贴吧图片

    package com.wang.xiaowei.utils; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.code ...

  8. 关于springmvc 返回json数据null字段的显示问题-转https://blog.csdn.net/qq_23911069/article/details/62063450

    最近做项目(ssm框架)的时候,发现从后台返回的json(fastjson)数据对应不上实体类,从数据库查询的数据,如果对应的实体类的字段没有信息的话,json数据里面就不显示,这不是我想要的结果,准 ...

  9. scanner 在java中的输入

    ************************************************************************************** 和C++的输入很像

  10. 使用docusaurus 搭建开发&&api && 博客站点

    对于日常的开发系统以及产品一个简单,方便的api&&文档网站可以七很大的作用 docusaurus 是facebook开源的文档管理框架,使用它我们可以快速的创建专业. 完备的文档站点 ...