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


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

    一、简介

            我们上一篇介绍了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 查找数组大小等于指定值的文档

         语法:

            

    [sql] view plain copy
     
    1. {field: {$size: number } }  

          例子:

            

    [sql] view plain copy
     
    1. >db.orders.find({"books":{$size:2}})  

           

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

          语法:

             

    [sql] view plain copy
     
    1. >db.collect.find({},{field:{$slice: number }})  

          number 说明:

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

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

          例子:

                

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

              

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

        

            语法:

               

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

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

           number1说明:

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

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

           例子:

              

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

             

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

    三、对数组内嵌文档查询

          我们先保存数据

    [sql] view plain copy
     
    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可以匹配内数组内的元素并返回文档数据

         语法:

            

    [sql] view plain copy
     
    1. >{field:{$elemMatch:{ field1:value1, field2:value2,………}}}  

       例子:

           

    [sql] view plain copy
     
    1. >db.orders.find({"items":{$elemMatch:{"quantity":2}}})  

          

          返回quantity为2的文档

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

          

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

       

       例子:

            

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

  • 相关阅读:
    2018年底,IOS面试题的复习之OC的反射机制
    Object-C的类可以多重继承吗?可以实现多个接口吗?category是什么?重写一个类的方式用继承好还是分类好,为什么?
    frame和bounds有什么不同?
    【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?
    IOS MVC与MVVM的区别
    IOS面试题2018/11/17
    OC的反射机制
    git使用
    mac git 删除本地仓库文件
    Android hide the app icon but show the icon most left
  • 原文地址:https://www.cnblogs.com/yanwei-wang/p/8608771.html
Copyright © 2020-2023  润新知