3).$not,$mod
$not是元条件句,可以用在任何其他条件上,表示非,$mod表示取模运算,对应运算符%,如:
> db.people.find()
{ "_id" : ObjectId("53a3e01d33c516902a43a797"), "name" : "mary", "age" : 20 }
{ "_id" : ObjectId("53a3e02533c516902a43a798"), "name" : "amy", "age" : 23 }
{ "_id" : ObjectId("53a3e02d33c516902a43a799"), "name" : "join", "age" : 18 }
{ "_id" : ObjectId("53a3e03c33c516902a43a79a"), "name" : "jodan", "age" : 25 }
{ "_id" : ObjectId("53a3e04933c516902a43a79b"), "name" : "mical", "age" : 19 }
> db.people.find({"age" : {"$not" : {"$mod" : [5, 0]}}}, {"_id" : 0})
{ "name" : "amy", "age" : 23 }
{ "name" : "join", "age" : 18 }
{ "name" : "mical", "age" : 19 }
这里表示对age进行取模运算,如果里面的$mod条件为对5取模,为0就符合条件,加上外面的$not,表示非,也就是模不为0就符合条件。
4).$exists,null
$exists表示判断键值是否已经存在,它的值为true或者false,null表示空值或不存在的字段,如:
> db.variable.find()
{ "_id" : ObjectId("53a3e91f33c516902a43a79c"), "x" : 1, "y" : null }
{ "_id" : ObjectId("53a3e92733c516902a43a79d"), "x" : 3 }
{ "_id" : ObjectId("53a3e92e33c516902a43a79e"), "x" : 5, "y" : 10 }
> db.variable.find({"y" : null}, {"_id" : 0})
{ "x" : 1, "y" : null }
{ "x" : 3 }
> db.variable.find({"y" : {"$in" : [null], "$exists" : true}}, {"_id" : 0})
{ "x" : 1, "y" : null }
当我们只查询y为null时,由于第二个文档中没有y字段所以也符合条件,那么如果要查询的文档y必须要存在而且为null,就用到了$exists。
5).正则表达式
没错,MongoDB也支持正则表达式来查询字符串,这就使得对字符串的查询更加的简单高效,正则表达式是查询字符串的神器,如:
> db.people.find()
{ "_id" : ObjectId("53a3e01d33c516902a43a797"), "name" : "mary", "age" : 20 }
{ "_id" : ObjectId("53a3e02533c516902a43a798"), "name" : "amy", "age" : 23 }
{ "_id" : ObjectId("53a3e02d33c516902a43a799"), "name" : "join", "age" : 18 }
{ "_id" : ObjectId("53a3e03c33c516902a43a79a"), "name" : "jodan", "age" : 25 }
{ "_id" : ObjectId("53a3e04933c516902a43a79b"), "name" : "mical", "age" : 19 }
> db.people.find({"name" : /jo.*/}, {"_id" : 0})
{ "name" : "join", "age" : 18 }
{ "name" : "jodan", "age" : 25 }
6).对内置数组的查询,$all,$size,$slice
对内置数组最简单的查询就是精确的指定条件,指定的条件表示该内置数组包含该元素,而不是等于,这是很有意思的,精确查询一般的字段都是指该字段的值等于我们给定的值,而对内置数组而言,是表示包含该元素。
如果要对数组通过多元素来匹配就要用到$all,如果包含$all给定的数组中的元素,就符合条件判断,$size表示数组的大小,$slice是find中第二个参数中指定的内容,表示返回数组的一个子集合,也就是查询到的数组返回哪几个元素,正数表示前几个,负数表示后几个,如:
> db.food.find()
{ "_id" : ObjectId("53a3ebcf33c516902a43a79f"), "fruit" : [ "apple", "banana", "orange" ] }
{ "_id" : ObjectId("53a3ee0e33c516902a43a7a0"), "fruit" : [ "bnana" ] }
{ "_id" : ObjectId("53a3ee1933c516902a43a7a1"), "fruit" : [ "apple", "orange" ] }
> db.food.find({"fruit" : "apple"}, {"_id" : 0})
{ "fruit" : [ "apple", "banana", "orange" ] }
{ "fruit" : [ "apple", "orange" ] }
> db.f