MongoDB的查询

来源:互联网 发布:帝国cms广告代码 编辑:程序博客网 时间:2024/05/19 11:20

MongoDB中的查询呢》是用find(  )来进行查找数据的。即是: db.user.find(  ) 。那么这一篇主要针对find(  )做详细的深入。

  1. 使用find和findOne函数和查询条件来查询对应的数据。
  2. 使用$ 条件来查询实现范围、集合包含、不等式和其他查询。
  3. 使用 $where 字句

1.find( )和findOne( )

在MongoDB中查询用find( )就可以对数据进行查询。findOne( )是查询最近的一个文档。当然里面也可以带参数,这样查询就更有针对性了。

[javascript] view plaincopy
  1. Microsoft Windows XP [版本 5.1.2600]  
  2. (C) 版权所有 1985-2001 Microsoft Corp.  
  3.   
  4. C:\Documents and Settings\Administrator>E:  
  5.   
  6. E:\>CD MongoDB  
  7.   
  8. E:\MongoDB>mongo.exe  
  9. MongoDB shell version: 2.0.2  
  10. connecting to: test  
  11. > use php  //使用php库  
  12. switched to db php  
  13. > db.blog.find() //使用find( )在blog集合中查找所有的文档,查询结果如下。  
  14. "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo""content"  
  15. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z") }  
  16. "_id" : ObjectId("4f0bc11d5a5904bae2b767a7"), "title" : "wowowowo""content"  
  17. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z"), "comments" : "hao a  
  18.  hao a " }  
  19. "_id" : ObjectId("4f0cf96bbc8c53013bb90682"), "title" : "okokok""content" :  
  20. "123456""time" : "2011023023""comments" : "23224" }  
  21. > db.blog.findOne()  //使用findOne( )查找最近的一条数据,而且格式很规范,很整齐。  
  22. {  
  23.         "_id" : ObjectId("4f0bc1245a5904bae2b767a8"),  
  24.         "title" : "wowowowo",  
  25.         "content" : "hahahahah",  
  26.         "time" : ISODate("2012-01-10T03:38:45.515Z")  
  27. }  
  28. > db.blog.find({"title":"wowowowo"}) //使用find()查找键为title,值为"wowowowo"的所有文档,结果如下。  
  29. "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo""content"  
  30. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z") }  
  31. "_id" : ObjectId("4f0bc11d5a5904bae2b767a7"), "title" : "wowowowo""content"  
  32. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z"), "comments" : "hao a  
  33.  hao a " }  
  34. > db.blog.findOne({"title":"wowowowo"}) //使用findOne()查找键为title,值为"wowowowo"的最近的一个文档。结果如下。  
  35. {  
  36.         "_id" : ObjectId("4f0bc1245a5904bae2b767a8"),  
  37.         "title" : "wowowowo",  
  38.         "content" : "hahahahah",  
  39.         "time" : ISODate("2012-01-10T03:38:45.515Z")  
  40. }  
  41. >  
那么,我想指定返回的键,某些键显示出来,某些键不显示出来,如何做到。其实也可以。就用到find(,,)函数中的第二个参数了,看实例:

[javascript] view plaincopy
  1. > db.blog.findOne({},{"title":1,"content":1})  //使用findOne()的第二个参数,设定为1,查询结果只显示title和content,_id这个键总是被返回。  
  2. {  
  3.         "_id" : ObjectId("4f0bc1245a5904bae2b767a8"),  
  4.         "title" : "wowowowo",  
  5.         "content" : "hahahahah"  
  6. }  
  7. > db.blog.findOne({},{"title":0,"content":0})  //设定为0,则查询结果不显示。等同于{"time":1}.  
  8. {  
  9.         "_id" : ObjectId("4f0bc1245a5904bae2b767a8"),  
  10.         "time" : ISODate("2012-01-10T03:38:45.515Z")  
  11. }  
  12. > db.blog.findOne({},{"title":0}) //不显示title  
  13. {  
  14.         "_id" : ObjectId("4f0bc1245a5904bae2b767a8"),  
  15.         "content" : "hahahahah",  
  16.         "time" : ISODate("2012-01-10T03:38:45.515Z")  
  17. }  
  18. > db.blog.findOne({},{"time":0,"_id":0})  //也可以把_id也不显示。  
  19. "title" : "wowowowo""content" : "hahahahah" }  
  20. > db.blog.findOne({},{"time":0,"_id":1}) //不能这样,错误!要么全是1.要么全是0 。  
  21. Fri Jan 13 10:43:34 uncaught exception: error {  
  22.         "$err" : "You cannot currently mix including and excluding fields. Conta  
  23. ct us if this is an issue.",  
  24.         "code" : 10053  
  25. }  
  26. >  

2.查询条件

上面是简单的查询,要想复杂的查询,就必须要加上查询条件,比如and ,or ,取反啊等等。

1.查询条件

“$lt”、"$lte"、“$gt”、“$gte”就是比较操作符,相当于<、<=、>、>=。

[javascript] view plaincopy
  1. > db.user.find({"age":{"$lt":30,"$gte":20}}) //查询20<=age<30的文档。  
  2. "_id" : ObjectId("4f0d057b081c6af197458524"), "age" : 22, "email" : [ "3@qq.co  
  3. m", "5@qq.com" ], "relationships" : { "friend" : 1000, "enemies" : 2 }, "sex" :  
  4. "nv""nan""no" ], "username" : "joe" }  
  5. >  
2.or查询

MongoDB中有两种方式查询OR。“$in”和“$nin” ,在这个范围内,不在这个范围内。

[javascript] view plaincopy
  1. > db.user.find({"age":{"$in":[10,22,34]}})  //区间,用中括号[].切记。  
  2. "_id" : ObjectId("4f0d057b081c6af197458524"), "age" : 22, "email" : [ "3@qq.co  
  3. m", "5@qq.com" ], "relationships" : { "friend" : 1000, "enemies" : 2 }, "sex" :  
  4. "nv""nan""no" ], "username" : "joe" }  
  5. >  

$or 是或的另一种表达形式,也是主要的或,范围比较广,比较的复杂的或。

[javascript] view plaincopy
  1. > db.blog.find({"$or":[{"title":"wowowowo"},{"content":"hao a hao a "}]})  //注意书写形式,[].  
  2. "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo""content"  
  3. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z") }  
  4. "_id" : ObjectId("4f0bc11d5a5904bae2b767a7"), "title" : "wowowowo""content"  
  5. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z"), "comments" : "hao a  
  6.  hao a " }  
  7. >  

3.$where查询

在Mongo系统中,键/值对是很有表现力的查询方式,但是依然有些需求它无法表达,当其他方法都败下阵下来时,就轮到“$where”了。用它可以执行任意的javascript作为查询的一部分,这使得查询能做(几乎)任何事情。

最典型的例子是比较一个文档中两个键的值是否相等。先插入两个文档到新建的foo集合中去,现在想查找文档中两个键的值是相同的一个文档,怎么办?

[javascript] view plaincopy
  1. > db.foo.insert({"apple":1,"banana":6,"peach":3})  
  2. > db.foo.insert({"apple":1,"spinach":4,"watermelon":4})  
可以用到"$where"了。

[javascript] view plaincopy
  1. > db.foo.find({"$where":function(){  //写一个函数,注意格式。  
  2. ... for (var current in this){  
  3. ...   for(var other in this){  
  4. ...     if(current != other && this[current] == this[other]){  
  5. ...        return true;  
  6. ...     }  
  7. ...   }  
  8. ... }  
  9. ... return false;  
  10. ... }}); //函数结束。输出结果。  
  11. "_id" : ObjectId("4f13cf7cae966b8ccbff69f2"), "apple" : 1, "spinach" : 4, "wat  
  12. ermelon" : 4 }  
  13. >  

3.查询的几个限制limit ,skip,sort。

在mysql中也有limit表示限制查询的数量,用order by  * (desc)来表示升序降序。在MongoDB中也用limit( )条件表示限制查询的数量。用sort( )来用查询结果中的一个键来排序。skip( )表示跳过多少个,再来查询结果。

[javascript] view plaincopy
  1. > db.blog.find().limit(1) //使用limit( )只显示一个结果出来。  
  2. "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo""content"  
  3. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z") }  
  4. >  
[javascript] view plaincopy
  1. > db.blog.find().skip(2) //表示跳过前往2个。再查询所有。  
  2. "_id" : ObjectId("4f0cf96bbc8c53013bb90682"), "title" : "okokok""content" :  
  3. "123456""time" : "2011023023""comments" : "23224" }  
  4. >  
[javascript] view plaincopy
  1. > db.blog.find().sort({time:1,comments:-1}) //安装time的升序,comments的降序排列查询结果。1表升序,-1表降序。  
  2. "_id" : ObjectId("4f0cf96bbc8c53013bb90682"), "title" : "okokok""content" :  
  3. "123456""time" : "2011023023""comments" : "23224" }  
  4. "_id" : ObjectId("4f0bc11d5a5904bae2b767a7"), "title" : "wowowowo""content"  
  5. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z"), "comments" : "hao a  
  6.  hao a " }  
  7. "_id" : ObjectId("4f0bc1245a5904bae2b767a8"), "title" : "wowowowo""content"  
  8. "hahahahah""time" : ISODate("2012-01-10T03:38:45.515Z") }  
  9. >  

也可以把这几个组合起来,对于分页来讲非常有用。

比如:你有个商店,有人想搜索MP3,若是想每页返回50个结果,而且是按价格从高到低排序,可以这样写:

[javascript] view plaincopy
  1. >db.stock.find({"name":"mp3"}).limit(50).sort("price":-1);  
点击”下一页“,可以看到更多结果,那么如何做呢?可以用到skip( )了。

[javascript] view plaincopy
  1. >db.stock.find({"name":"mp3"}).limit(50).skip(50).sort({"price":-1});  
不过skip( )略过多的结果,可能导致问题,少量的可以,当大量的文档时候,容易紊乱出错。
原创粉丝点击