MongoDB自学笔记10---4.2查询文档(四)

2014-11-24 17:08:24 · 作者: · 浏览: 3
" : "yue" }

{ "_id" : 2, "age" : 2 }

{ "_id" : 3, "age" : 15 }

> db.c2.find({age:{$mod:[2,1]}}) /*age取模2余1的文档*/

{ "_id" : 3, "age" : 15 }

> db.c2.find({name:{$mod:[2,1]}})

$type

语法:{ field: {$type: } }

按照字段的类型查找文档。每种类型对应的数字,下面已经列出了。

类型

编号

双精度

1

字符串

2

对象

3

数组

4

二进制数据

5

对象 ID

7

布尔值

8

日期

9

10

正则表达式

11

JavaScript

13

符号

14

java script(带范围)

15

32 位整数

16

时间戳

17

64 位整数

18

最小键

255

最大键

127

在mongodbshell中某些类型是不存在的,比如数字32位精度表示的是双精度。

> db.c2.find()

{ "_id" : 1, "name" : "yue" }

{ "_id" : 2, "age" : 2 }

{ "_id" : 3, "age" : 15 }

> db.c2.find({age:{$type:1}}) /*age类型为双精度的文档*/

{ "_id" : 2, "age" : 2 }

{ "_id" : 3, "age" : 15 }

java script选择器

此类选择器包括$regex、$where。

$regex

查找满足正则表达式的文档。

>db.user.find()

{"_id" : 1, "name" : "user1", "age" : 1}

{"_id" : 2, "name" : "user2", "age" : 2}

{"_id" : 3, "name" : "user3", "age" : 3}

{"_id" : 4, "name" : "user4", "age" : 4}

{"_id" : 5, "name" : "user5", "age" : 5}

{"_id" : 6, "sex" : "nan" }

>db.user.find({name:/user*/i})

{"_id" : 1, "name" : "user1", "age" : 1}

{"_id" : 2, "name" : "user2", "age" : 2}

{"_id" : 3, "name" : "user3", "age" : 3}

{"_id" : 4, "name" : "user4", "age" : 4}

{"_id" : 5, "name" : "user5", "age" : 5}

Mongodb中的regex兼容perl,类似上面代码中的正则表达式是比较方便的。Mongodb同样也可以使用$regex方法。例子如下:

>db.user.find()

{"_id" : 1, "name" : "user1", "age" : 1}

{"_id" : 2, "name" : "user2", "age" : 2}

{"_id" : 3, "name" : "user3", "age" : 3}

{"_id" : 4, "name" : "user4", "age" : 4}

{"_id" : 5, "name" : "user5", "age" : 5}

{"_id" : 6, "sex" : "nan" }

>db.user.find({name:{$regex:"user*",$options:"i"}}) /*$options设置正则选项*/

{"_id" : 1, "name" : "user1", "age" : 1}

{"_id" : 2, "name" : "user2", "age" : 2}

{"_id" : 3, "name" : "user3", "age" : 3}

{"_id" : 4, "name" : "user4", "age" : 4}

{"_id" : 5, "name" : "user5", "age" : 5}

$where

$where可以根据表达式或者function查找满足的文档。使用function的时候如果返回的是true,则查找出此文档。

>db.user.find()

{"_id" : 1, "name" : "user1", "age" : 1}

{"_id" : 2, "name" : "user2", "age" : 2}

{"_id" : 3, "name" : "user3", "age" : 3}

{"_id" : 4, "name" : "user4", "age" : 4}

{"_id" : 5, "name" : "user5", "age" : 5}

{"_id" : 6, "sex" : "nan" }

>db.user.find({$where:"this.sex == 'nan'"})

{"_id" : 6, "sex" : "nan" }

>db.user.find({$where:"obj.sex == 'nan'"})

{"_id" : 6, "sex" : "nan" }

>db.user.find({$where:function(){return this.sex == 'nan';}})

{"_id" : 6, "sex" : "nan" }

>db.user.find({$where:function(){return obj.sex == 'nan';}})

{"_id" : 6, "sex" : "nan" }

以上代码中的this和obj都代表当前的文档。

地理位置选择器

参看4.5地理空间搜索

数组选择器

数组选择器主要是对数组操作的,包括$elemMatch、$size。

$elemMatch

对于字段的值是数组,而且数组中的元素是内嵌的文档,在我们根据数组中的内嵌文档做查询的时候,需要 $elemMatch。

>db.c3.find()

{"_id" : 1, "array" : [ { "value1" : 1,"value2" : 0 }, { "value1" : 2, "value2" : 2 } ]}

> db.c3.find({ array: { $elemMatch: { value1: 1, value2: { $gt: 1 } } } } )

> db.c3.find({ array: { $elemMatch: { value1: 1, value2: { $lt: 1 } } } } )

{"_id" : 1, "array" : [ { "value1" : 1,"value2" : 0 }, { "value1" : 2, "value2" : 2 } ]}

从上面的代码中可以看出$elemMath会循环数组中的每一内嵌文档,然后与给定的条件进行比较,查找出满足条件的文档。

$size

语法:db.collection.find({ field: { $size: } } )

查找出数组的长度满足给定值的数组。

>db.c4.find()

{"_id" : 1, "ary" : [ 1 ] }

{"_id" : 2, "ary" : [ 2, 3 ] }

{"_id" : 3, "ary" : [ 4, 5, 6 ] }

>db.c4.find({ary:{$size:5}}) /*没有数组长度等于5的文档*/

>db.c4.find({ary:{$size:2}})

{"_id" : 2, "ary" : [ 2, 3 ] }