MongoDB基本操作-查询文档(下)

Posted Buddy Yuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB基本操作-查询文档(下)相关的知识,希望对你有一定的参考价值。

3.指定过滤字段

前面我们主要使用Query filter进行过滤,而Projection是过滤查询字段的,下面我们来介绍一下Projection

例:查询全部字段

db.users.find();

例:查询nameage字段,同时namebob的文档,使用下列查询。

> db.users.find({name:"bob"},{name:1,age:1} )

这里默认会把id给查出来,如果我们不想把id查出来,可以对id进行过滤,使用下列查询。

> db.users.find({name:"bob"},{name:1,age:1,_id:0})

例:查询namebob的文档,不显示typestatusfavorites字段

> db.users.find({name:"bob"},{type:0, status:1, favorites:0})

4.Nullmissing fileds的查询

当我们某个查询条件需要查询null的时候。我们可能会遇到一些麻烦。还是和以前一样,我们先造点数据。

db.items.insertMany(

[

{ _id: 1, item: null },

{ _id: 2 }

])

这个集合的第一个文档itemnull,第二个文档直接没有item。我们直接对item查询null,看看会是什么效果。

> db.items.find( { item:null });

{ "_id" : 1, "item": null }

{ "_id" : 2 }

可以看到直接把两条结果都查询出来了,这个查询会把itemnull或者没有item的文档都列出来。如果要单独把itemnull的列出来,需要使用$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);});

6limitskipsort操作

除了查询结果,我们还要知道如何对结果进行限制、跳跃和排序。

l  Limitlimit主要是限制文档返回的数量。

> 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  Sortsort主要是对指定的字段进行排序,并使用数字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基本操作-查询文档(下)的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 分组聚合查询

MongoDB各种查询操作详解

MongoDB基本操作-查询文档(上)

MongoDB查询操作限制返回字段的方法

MongoDB——文档操作(查询文档)

MongoDB 原子操作