作者:凌晨 | 来源:互联网 | 2014-05-28 16:53
1,find用法.查询就是返回一个集合中的文档的子集.查询的一般操作是使用find,若没有向find传递参数,默认的是显示所有文档db.blog.find(){_id:ObjectId(4f6e766e811cca6e90f0dab5),name:testmongo,age:20}.指定多个查询条件:
1, find 用法
.查询就是返回一个集合中的文档的子集
.查询的一般操作是使用find,若没有向find传递参数,默认的是显示所有文档
db.blog.find()
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" :
"testmongo", "age" : 20 }
.指定多个查询条件:
db.blog.find("title":"hello", "name":"test")
.指定返回的键值
db.blog.find({},{"name":1})
#返回只包含一个键值"name"的所有记录
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" :
"testmongo" }
可见无论指定哪些键,其中的_id键始终存在与查询结果中。
.过滤键值
db.blog.find({}, {"name":0}) //结果中不显示键name的值
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "age" : 20
}
.也可以两者结合
> db.blog.find({}, {"name":1, "age":1, "_id":0})
//只显示name和age的键/值
{ "name" : "testmongo", "age" : 20 }
2, 查询条件
"$lt","$lte","$gt","$gte"
是全部的比较操作,分别对应:<,<=,>,>=。可以将这些组合起来使用。 $ne是不等于的意思。
> db.blog.find({"age":{"$gte":18, "$lt":30}})
//查找年龄>18并且<30的记录
> db.blog.find({"age":{"$ne":20}})
//查询年龄不等于20的记录
$in 用来查询单一键和多个值的匹配。可以把多个值组织成一个数组。
> db.blog.find({"age":{"$in":[20,40]}})
//差选age为20或40的记录
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" :
"testmongo", "age" : 20 }
//查询age为20或40的记录,不输出_id键字段
> db.blog.find({"age":{"$in":[20,40]}},{"_id":0})
{ "name" : "testmongo", "age" : 20 }
.$in可以匹配不同类型的值,也可以匹配单个值
//查找名字为jack或20或40的记录
> db.blog.find({"name":{"$in":["jack",20,40]}})
{ "_id" : ObjectId("4f70f21e248df4040465dec5"), "name" : "jack", "age" : 80, "level" : 5 }
$nin和$in的用法相同,只不过它的意义相反,表示不在...范围
$or查询多个键值的任意给定值
#查询name为jack或age为20的记录
> db.blog.find({"$or":[{"name":"jack"}, {"age":20}]})
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" :
"testmongo", "age" : 20 }
{ "_id" : ObjectId("4f70f21e248df4040465dec5"), "name" :
"jack", "age" : 80, "level" : 5 }
$not
$mod
.关于null
#查找"commit"键的值为null的记录。但这样达不到预期效果,它不仅查出了commit为Null的记录,还查出了不存在commit键的记录,结果如下:
> db.blog.find({"commit":null})
{ "_id" : ObjectId("4f6e766e811cca6e90f0dab5"), "name" : "testmongo", "age" : 20 }
{ "_id" : ObjectId("4f70f8e1248df4040465dec8"), "name" : "test1", "age" : 30, "commit" : null }
#再次查找commit为null的记录
> db.blog.find({"commit":{"$in":[null], "$exists":true}})
{ "_id" : ObjectId("4f70f8e1248df4040465dec8"), "name" : "test1", "age" : 30, "commit" : null }
可以看到这次可以了。 $exists关键字表示是否存在的意思。
3,查询数组
数组可以看成是,每个元素的值都代表了整个键的值。
$all操作
#查询commit字段中,既包括t1又包括t2的记录
> db.blog.find({"commit":{$all:["t1","t2"]}})
{ "_id" : ObjectId("4f710330248df4040465dec9"), "name" : "tt", "commit" : [ "t1", "t2", "t3" ] }
4,$where查询
#查询blog集合中的键age的值大于40的记录,以下几种方法都可以:
> db.blog.find({$where:"this.age>40"})
> db.blog.find({age:{"$gt":40}})
> db.blog.find("this.age>40")
输出结果:
{ "_id" : ObjectId("4f70f21e248df4040465dec5"), "name" :
"jack", "age" : 80, "level" : 5 }
5,游标
游标就是在查询出多个记录时,在多个记录中访问的指针:
#先插入记录
> for (i=0; i<100; i++) {
... db.c.insert({x:i});
... }
#使用游标
> for (var cur=db.c.find(); cur.hasNext(); ) {
... printjson(cur.next());
... }
{ "_id" : ObjectId("4f71c294317f1d737e698fec"), "x" : 0 }
{ "_id" : ObjectId("4f71c294317f1d737e698fed"), "x" : 1 }
5.1 limit函数
#显示查询结果的数量为不多于2条,:
> db.c.find().limit(2)
#2为记录的上限
{ "_id" : ObjectId("4f71c294317f1d737e698fec"), "x" : 0 }
{ "_id" : ObjectId("4f71c294317f1d737e698fed"), "x" : 1 }
5.2 skip (n)函数
#跳过n条记录,显示跳过以后剩下的记录。若mongodb中的记录小于n条,则不返回任何记录。
> db.c.find().skip(98)
#跳过前面的0-97条记录,从98号记录开始显示
{ "_id" : ObjectId("4f71c294317f1d737e69904e"), "x" : 98 }
{ "_id" : ObjectId("4f71c294317f1d737e69904f"), "x" : 99 }
注意:若要跳过大量的记录skip是很慢的,所以要尽量避免跳过大量记录,而用查询语句来代替。
5.3 sort函数
该函数多个记录进行排序操作,该函数的参数是一个或多个键/值对,键代表要排序的键名,值代表排序的方向,1是升序,-1是降序。
有时候一个键的值是多种类型的,这时需要有一个默认的顺序:
最小值,null,数字,字符串,文档,数组,二进制数,对象ID,日期,时间,正则表达式,最大值。