{ "_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 ] }