集合查询find
方法: db.collection.find(query, projection).
查询集合(colleciton)中文档(document)并返回结果为游标(cursor)的文档集合。
mongodb中使用find来进行查询。查询就是返回一个集合中文档的子集,子集的范围从0个文档到整个集合。
find的第一个参数query,决定了要返回的哪些文档,指定查询条件。
第二个参数projection:是返回的键,默认文档所有的键。
空的查询文档(eg:{})会匹配集合中的全部内容,要是不指定查询文档,默认就是{}.
db.users.find();
db.users.find({"name": "python"});
db.users.find(): 将批量返回集合users中的所有文档。
db.users.find({"name": "python"}): 将返回name是python的文档集合。
指定要返回的键
有时候不需要将所有的键/值对都返回。
遇到这种情况,就可以通过find(findOne相同)的第二个参数来指定想要的键。
eg:只获取name字段,且_id字段不要。
db.users.find({},{name:1,_id:0})
//{ "name" : "python" }
//{ "name" : "ruby" }
//{ "name" : "js" }
//{ "name" : "java" }
默认情况下:_id 这个键是总返回的,即使没指定返回这个键,如果想要某字段不返回,那设置{'key': 0}即可。
limit、skip、sort
如果集合太大,这时候限制查询文档数量,或者跳过前面多少个,排序查询。
limit:最多返回的文档数
限制返回结果数量上限,而不是限制返回的下限哦!
db.users.find({},{name:1,age:1,_id:0}).limit(2)
//{ "name" : "python", "age" : 25 }
//{ "name" : "ruby", "age" : 12 }
db.users.find({},{name:1,age:1,_id:0}).limit(20)
//{ "name" : "python", "age" : 25 }
//{ "name" : "ruby", "age" : 12 }
//{ "name" : "js", "age" : 12 }
//{ "name" : "java", "age" : 22 }
skip: 跳过多少个
db.users.find({},{name:1,age:1,_id:0}).count()
//4
db.users.find({},{name:1,age:1,_id:0}).skip(2)
//{ "name" : "js", "age" : 12 }
//{ "name" : "java", "age" : 22 }
users集合中总共4条记录,跳过2条后查询,总共返回2条文档。
sort:排序
sort接受一个对象作为参数:
排序的方向可以是1(升序)或者-1(降序)。
如果指定了多个键,则按照这些键的指定顺序逐个排序。
db.users.find({},{name:1,age:1,_id:0}).sort({age:1})
// { "name" : "ruby", "age" : 12 }
// { "name" : "js", "age" : 12 }
// { "name" : "java", "age" : 22 }
// { "name" : "python", "age" : 25 }
db.users.find({},{name:1,age:1,_id:0}).sort({age:-1,name:1})
// { "name" : "python", "age" : 25 }
// { "name" : "java", "age" : 22 }
// { "name" : "js", "age" : 12 }
// { "name" : "ruby", "age" : 12 }
复合使用:
db.users.find({},{name:1,age:1,_id:0}).limit(2).skip(1).sort({age:-1,name:1})
// { "name" : "java", "age" : 22 }
// { "name" : "js", "age" : 12 }
db.users.find({},{name:1,age:1,_id:0}).sort({age:-1,name:1}).limit(2).skip(1)
// { "name" : "java", "age" : 22 }
// { "name" : "js", "age" : 12 }
db.users.find({},{name:1,age:1,_id:0}).limit(2).sort({age:-1,name:1})
// { "name" : "python", "age" : 25 }
// { "name" : "java", "age" : 22 }
从上面三个例子可以看出是:先排序(sort),然后跳过(skip)行数,再取limit行结果返回。
findOne
方法: db.collection.findOne(query, projection)
参数和find相同,findOne是只返回一条复合条件的文档。
db.users.findOne({},{name:1,age:1,_id:0})
// { "name" : "python", "age" : 25 }
游标(cursor)
数据库使用游标(cursor)返回find的执行结果。
客户端通过cursor对最终结果进行有效的控制。
cursor.hasNext()检查是否还有后续结果的存在,有的话用cursor.next()获取文档。
var cursor = db.users.find().skip(1).sort({age:1}).limit(3);
cursor.forEach(function(x){
print(x.name);
});
// js
// java
// python
当在调用find的时候,shell并不会立刻查询数据库的,而是等待真正开始要求获取结果时才发送查询。
这样可以在执行之前可以查询附加额外的选项。
几乎游标对象的每个方法都返回本身,这样可以按任意顺序组成方法链。
所以:find的时候,还只是构造查询。