码迷,mamicode.com
首页 > 数据库 > 详细

MongoDB 查询操作(上)(二)

时间:2015-07-11 15:13:16      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:mongodb   nosql   

   

一、简介

    MongoDB提供了db.collection.find() 方法是查询集合中文档并返回结果为游标的文档集合和db.collection.findOne()方法是只返回其中的第一条记录,而不是返回游标的文档集合。

   db.collection.find()可以实现根据条件查询和指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段。并返回到匹配文档的游标。可以随意修改查询限制、跳跃、和排序顺序的功能。


二.db.collection.find()查询数据

   语法

   

<span style="font-size:18px;"> db.collection.find(query,projection)</span>

 

参数

类型

描述

query

document

可选. 使用查询操作符指定查询条件

projection

document

指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段

 

projection语法:

 

<span style="font-size:18px;">{ field1: <boolean>, field2: <boolean> ... }</span>


 

 说明:

   1或者true表示返回字段

   0或者false表示不返回该字段

 

    _id:默认就是1,没指定返回该字段时,默认会返回,除非设置为0是,就不会返回该字段。

    指定返回字段,有时文档字段多并数据大时,我们指定返回我们需要的字段,这样既节省传输数据量,减少了内存消耗,提高了性能,在数据大时,性能很明显的。

   

1.  查询数据

   

(1)返回集合中所有文档:

     db.collection.find()

     或者

    db.collection.find({})


   技术分享


   如同SQL语句:

   SELECT * FROM TABLENAME


技术分享


   

   技术分享



(2)指定使用投影运算符返回的字段省略此参数返回匹配文档中的所有字段

      

         语法:

         

         db.orders.find({},{field1: <boolean>, field2: <boolean> ... })


     例子:

   

      db.orders.find({},{"onumber":1,"cname":1})


技术分享

   而_id默认设置是1,所有也返回回来

 

    可以设置_id不返回

   

    例子:


    db.orders.find({},{"onumber":1,"cname":1,"_id":0})

技术分享


 

2. 根据条件查询

   (1)     等于条件查询

           

     语法:

     db.collect.find({<field1>: <value1>,<field2>: <value2>, ... })

技术分享


    例子:

 

    db.orders.find({"onumber":"002"})


技术分享


     查找onumber=002的文档

 

  (2)     比较操作符

 

    $gt(大于)、$gte(大于或等于)、 $lt(小于)、 $lte(小于或等于)


    语法:

 

    { <field1>: { <expression1> },<field2>: {<expression1> }, ... }

 

     1)$gt(大于)比较操作符

 

       例子:

        

     db.orders.find({"onumber":{$gt:"003"}})
        

       技术分享

          

        我们查找onumber>003的值只有004

 

    2)$gte(大于或等于)与 $lte(小于或等于)联合查询并指定返回字段(通过第二参数)

 

       例子:

      db.orders.find({"onumber":{$gte:"002",$lte:"003"}},{"onumber":1,"cname":1})
   

   技术分享

 

      我们查找002=<onumber<=003 并指定返回onumber和cname字段,而_id默认设置是1,所有也返回回来

 

(3) $or、和 $and 条件查询

      1)$and 条件查询

      

        语法:

           

       { $and: [ { <expression1> }, { <expression2> } , ... , ]}

      简单的用法的语法:

     

   { <field1>: <value1>,<field2>: <value2>, ...}


     例子:

     

    db.orders.find({"onumber":"002","cname":"zcy2"})
   

   技术分享

     查找onumber=002 AND cname= zcy2 查询文档

     

   2)$or(或者)条件查询

      

      语法:

      

       { $nor: [ { <expression1> }, { <expression2> }, ... ] }

    例子:

      

     db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})

 技术分享

    我们条件onumber=002 OR cname= zcy1 查找只要符合onumber=002或者cname= zcy1条件的文档

 

  3) $or 和$and 联合条件查询

   

    例子:

   

     db.orders.find({$and:[{"date":"2015-07-01"},{$or:[{"onumber":"002"},{"cname":"zcy1"}]}]})
  

技术分享     

     查询条件 date=2015-07-01and (onumber=002 OR cname=zcy1) 的文档,就是既等如date等于2015-07-01 并且要满足onumber等于002或者cname等于zcy1其中一个就可以。

(4)$in(包含)、$nin(不包含)条件查询

       1)$in(包含)条件查询


           语法:

              

          { field: { $in: [<value1>, < value2>, ...] } }

          例子:

                

         db.orders.find({"onumber":{$in:["001","002"]}})

               技术分享

             查询onumber in("001","002") 条件的文档,就是onumber等于001或者等于002 这个跟$or有点像,不过$or做为条件查询时,可以指定不同的字段:  db.orders.find({$or:[{"onumber":"002"},{"cname":"zcy1"}]})

,而$in只针对一个字段。


       2)$nin(不包含)条件查询

           

           语法:

               

         { field: { $nin: [<value1>, < value2>, ...] } }

            $nin(不包含)跟$in(包含)相反的,这里就不做具体的介绍

 

(5)$not(不等于) 条件查询

       语法:

        

      { field: { $not: { < expression1> } } }


        $not操作符不能独立使用,必须跟其他操作条件一起使用(除$regex)

         

           技术分享


    例子:

        

     db.orders.find({"onumber":{$not:{$gt:"002"}}})

         技术分享

      查找onumber不等于大于002的文档数据

 

(6)$exists用来判断一个field是否存在

      语法:

          

       { field: { $ exists:  < boolean>  } }


       例子:

          

        db.orders.find({"age":{$exists:true}})

技术分享

 

     没有age这个元素,什么都没返回

 

     插入有age元素,在执行一下


         技术分享

 

 

(7)$mod取模并等于指定的值

     语法:

       

     { field: { $mod: [ value, value2 ]} }

     对元素field值对value取模的,取模的值要value2的文档数据

 

     例子:

        

    db.orders.find({"age":{$mod:[5,1]}})

        技术分享

     对age元素的值和5取模,取模的值要等于1的文档数据

 

(8)null 查找元素不存在和元素对应的值为null的文档

      语法:

         { field: null }

  

      例子:

       

      db.orders.find({"age":null})

           技术分享


       1)      查找age元素存在并值等于null

            

        db.orders.find({"age":{$in:[null],$exists:true}})

              技术分享

  

(9) $type来匹配一个元素的类型

     语法:

       { field: { $type: < number >} }

 

      number 是MongoDB中使用的类型对应的类型值

类型

类型值

Double

1

String

2

Object

3

Array

4

Binary data

5

Undefined (deprecated)

6

Object id

7

Boolean

8

Date

9

Null

10

Regular Expression

11

JavaScript

13

Symbol

14

JavaScript (with scope)

15

32-bit integer

16

Timestamp

17

64-bit integer

18

Min key

255

Max key

127

 

2.对数组根据条件查询

 

   $all、$size、$where、$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个元素

 

 

3、对数组内嵌文档查询

      

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

MongoDB 查询操作(上)(二)

标签:mongodb   nosql   

原文地址:http://blog.csdn.net/congcong68/article/details/46841075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!