MongoDB查询操作(上)(二)(二)

2015-07-24 07:06:47 · 作者: · 浏览: 1
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

java script (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: [ , ... ]}

?

\

例子:

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