MongoDB基本操作-查询文档(下)
Posted Buddy Yuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB基本操作-查询文档(下)相关的知识,希望对你有一定的参考价值。
3.指定过滤字段
前面我们主要使用Query filter进行过滤,而Projection是过滤查询字段的,下面我们来介绍一下Projection
例:查询全部字段
db.users.find();
例:查询name和age字段,同时name为bob的文档,使用下列查询。
> db.users.find({name:"bob"},{name:1,age:1} )
这里默认会把id给查出来,如果我们不想把id查出来,可以对id进行过滤,使用下列查询。
> db.users.find({name:"bob"},{name:1,age:1,_id:0})
例:查询name为bob的文档,不显示type、status、favorites字段
> db.users.find({name:"bob"},{type:0, status:1, favorites:0})
4.对Null和missing fileds的查询
当我们某个查询条件需要查询null的时候。我们可能会遇到一些麻烦。还是和以前一样,我们先造点数据。
db.items.insertMany(
[
{ _id: 1, item: null },
{ _id: 2 }
])
这个集合的第一个文档item为null,第二个文档直接没有item。我们直接对item查询null,看看会是什么效果。
> db.items.find( { item:null });
{ "_id" : 1, "item": null }
{ "_id" : 2 }
可以看到直接把两条结果都查询出来了,这个查询会把item为null或者没有item的文档都列出来。如果要单独把item为null的列出来,需要使用$type:10进行过滤。这里的$type是基于bosn类型来检索集合中匹配结果的值。$type:10正好代表null。
> db.items.find( {item:{$type:10}} )
{ "_id" : 1, "item": null }
如果你只想查询没有item字段的文档,那么查询表达式需要使用$exists来过滤。
db.items.find( {item:{$exists:false}} )
{ "_id" : 2 }
5.mongo shell命令行迭代游标
db.collection.find()方法默认会返回一个游标,要访问全部文档,需要迭代(iterate)游标。如果返回的游标未使用var关键字分配给变量。那么游标自动迭代20次,打印结果集中的前20个文档。我们举个例子实验一下。
> for(var i=0;i<10000;i++){
...db.moves.insert({"name":i,"years":i});
... }
WriteResult({ "nInserted" : 1})
先插入10000条记录,然后执行db.moves.find();
> db.moves.find();
{ "_id" :ObjectId("59cc89622eda6984a43972b8"), "name" : 0,"years" : 0 }
{ "_id" :ObjectId("59cc89622eda6984a43972b9"), "name" : 1,"years" : 1 }
{ "_id" :ObjectId("59cc89622eda6984a43972ba"), "name" : 2,"years" : 2 }
{ "_id" :ObjectId("59cc89622eda6984a43972bb"), "name" : 3,"years" : 3 }
{ "_id" :ObjectId("59cc89622eda6984a43972bc"), "name" : 4,"years" : 4 }
{ "_id" :ObjectId("59cc89622eda6984a43972bd"), "name" : 5,"years" : 5 }
{ "_id" :ObjectId("59cc89622eda6984a43972be"), "name" : 6,"years" : 6 }
{ "_id" :ObjectId("59cc89622eda6984a43972bf"), "name" : 7,"years" : 7 }
{ "_id" :ObjectId("59cc89622eda6984a43972c0"), "name" : 8,"years" : 8 }
{ "_id" :ObjectId("59cc89622eda6984a43972c1"), "name" : 9,"years" : 9 }
{ "_id" :ObjectId("59cc89622eda6984a43972c2"), "name" : 10,"years" : 10 }
{ "_id" :ObjectId("59cc89622eda6984a43972c3"), "name" : 11,"years" : 11 }
{ "_id" :ObjectId("59cc89622eda6984a43972c4"), "name" : 12,"years" : 12 }
{ "_id" :ObjectId("59cc89622eda6984a43972c5"), "name" : 13,"years" : 13 }
{ "_id" :ObjectId("59cc89622eda6984a43972c6"), "name" : 14,"years" : 14 }
{ "_id" :ObjectId("59cc89622eda6984a43972c7"), "name" : 15,"years" : 15 }
{ "_id" :ObjectId("59cc89622eda6984a43972c8"), "name" : 16,"years" : 16 }
{ "_id" :ObjectId("59cc89622eda6984a43972c9"), "name" : 17,"years" : 17 }
{ "_id" :ObjectId("59cc89622eda6984a43972ca"), "name" : 18,"years" : 18 }
{ "_id" :ObjectId("59cc89622eda6984a43972cb"), "name" : 19,"years" : 19 }
Type "it" for more
可以看到游标只返回了20行数据,可以输入it,就能返回下面20行。这个行数是在mongo shell中通过DBQuery.shellBatchSize参数来控制的。
> DBQuery.shellBatchSize=5
5
> db.moves.find();
{ "_id" :ObjectId("59cc89622eda6984a43972b8"), "name" : 0,"years" : 0 }
{ "_id" :ObjectId("59cc89622eda6984a43972b9"), "name" : 1,"years" : 1 }
{ "_id" :ObjectId("59cc89622eda6984a43972ba"), "name" : 2,"years" : 2 }
{ "_id" :ObjectId("59cc89622eda6984a43972bb"), "name" : 3,"years" : 3 }
{ "_id" :ObjectId("59cc89622eda6984a43972bc"), "name" : 4,"years" : 4 }
Type "it" for more
我们可以定义一个var变量来保存这个游标。
> var cursor=db.moves.find();
接下来我们使用while循环对游标进行遍历。
while (cursor.hasNext()) {
print(tojson(cursor.next()));
}
这里我们使用的是print(tojosn())的方法,也可以使用printjosn()的方法。这里要注意,每一次运行前都要重新定义var变量来保存游标
while (cursor.hasNext()) {
printjson(cursor.next());
}
当然我们也可以使用foreach语法进行遍历。
var cursor=db.moves.find();
cursor.forEach( function(doc) {printjson(doc);});
6.limit、skip和sort操作
除了查询结果,我们还要知道如何对结果进行限制、跳跃和排序。
l Limit:limit主要是限制文档返回的数量。
> db.moves.find().limit(5);
{ "_id" :ObjectId("59cc89622eda6984a43972b8"), "name" : 0,"years" : 0 }
{ "_id" :ObjectId("59cc89622eda6984a43972b9"), "name" : 1,"years" : 1 }
{ "_id" :ObjectId("59cc89622eda6984a43972ba"), "name" : 2,"years" : 2 }
{ "_id" :ObjectId("59cc89622eda6984a43972bb"), "name" : 3,"years" : 3 }
{ "_id" :ObjectId("59cc89622eda6984a43972bc"), "name" : 4,"years" : 4 }
l Sort:sort主要是对指定的字段进行排序,并使用数字1(升序)和-1(降序)来执行排序方式是升序还是降序,这种操作类似于关系型数据库当中的order by …desc
>db.moves.find({"name":{$lt:5}}).sort({"years":-1})
{ "_id" :ObjectId("59cc89622eda6984a43972bc"), "name" : 4,"years" : 4 }
{ "_id" :ObjectId("59cc89622eda6984a43972bb"), "name" : 3,"years" : 3 }
{ "_id" :ObjectId("59cc89622eda6984a43972ba"), "name" : 2,"years" : 2 }
{ "_id" :ObjectId("59cc89622eda6984a43972b9"), "name" : 1,"years" : 1 }
{ "_id" :ObjectId("59cc89622eda6984a43972b8"), "name" : 0,"years" : 0 }
l Skip: skip主要是帮助我们跳过指定的文档数,例如,我想跳过前面300个文档。直接就从300开始查起。同样我们还可以加上limit。能够帮助我们迅速实现分页功能。
> db.moves.find().skip(301).limit(5);
{ "_id" :ObjectId("59cc89622eda6984a43973e4"), "name" : 300,"years" : 300 }
{ "_id" :ObjectId("59cc89622eda6984a43973e5"), "name" : 301,"years" : 301 }
{ "_id" :ObjectId("59cc89622eda6984a43973e6"), "name" : 302,"years" : 302 }
{ "_id" :ObjectId("59cc89622eda6984a43973e7"), "name" : 303,"years" : 303 }
{ "_id" :ObjectId("59cc89622eda6984a43973e8"), "name" : 304,"years" : 304 }
以上是关于MongoDB基本操作-查询文档(下)的主要内容,如果未能解决你的问题,请参考以下文章