mongodb java findone_MongoDB数据查询 find和findOne

集合查询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的时候,还只是构造查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值