资讯专栏INFORMATION COLUMN

MongoDB学习札记第四篇之Query

RebeccaZhong / 790人阅读

摘要:系列专题查询条件首先往数据库集合里面插入几条数据。指定了之后,显示具体的条数,上文中,表示,显示条文档。其中,表示要排序的字段,的可取值为。要对集合进行排序。其中按照升序,按照降序。发现逆序排序了。至此,说明我们的实验成功了。

</>复制代码

  1. 系列专题http://www.codefrom.com/p/mongodb

查询条件

首先往数据库集合里面插入几条数据。
测试数据:

</>复制代码

  1. > db.users.insert({username:"mongo", url:"webinglin.github.io", tags:["mongodb", database","nosql"],likes:999, author:"linwenbin"})
  2. > db.users.insert({username:"redis", url:"webinglin.github.io", tags:["redis","database","nosql"],likes:888, author:"linwenbin"})
  3. > db.users.insert({username:"spring", url:"webinglin.github.io", tags:["spring","framework"],likes:777, author:"linwenbin"})
  4. > db.users.find().pretty()
  5. {
  6. "_id" : ObjectId("5574bdabc705777157a515aa"),
  7. "username" : "mongo",
  8. "url" : "webinglin.github.io",
  9. "tags" : [
  10. "mongodb",
  11. "database",
  12. "nosql"
  13. ],
  14. "likes" : 999,
  15. "author" : "linwenbin"
  16. }
  17. {
  18. "_id" : ObjectId("5574bdd2c705777157a515ab"),
  19. "username" : "redis",
  20. "url" : "webinglin.github.io",
  21. "tags" : [
  22. "redis",
  23. "database",
  24. "nosql"
  25. ],
  26. "likes" : 888,
  27. "author" : "linwenbin"
  28. }
  29. {
  30. "_id" : ObjectId("5574bdf3c705777157a515ac"),
  31. "username" : "spring",
  32. "url" : "webinglin.github.io",
  33. "tags" : [
  34. "spring",
  35. "framework"
  36. ],
  37. "likes" : 777,
  38. "author" : "linwenbin"
  39. }

pretty() 方法是对查询结果进行格式化
查询的时候可以带上查询条件,那具体的查询条件怎么使用?
等于
等于操作直接使用 {key:value} 这样的文档形式即可

</>复制代码

  1. > db.users.find({username:"mongo"})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. >

大于
语法: {key : {$gt:value} }

</>复制代码

  1. > db.users.find({likes:{$gt:888}})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. >

大于等于
语法: {key : {$gte:value} }

</>复制代码

  1. > db.users.find({likes:{$gte:888}})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. { "_id" : ObjectId("5574bdd2c705777157a515ab"), "username" : "redis", "url" : "webinglin.github.io", "tags" : [ "redis", "database", "nosql" ], "likes" : 888, "author" : "linwenbin" }

小于
语法: {key : {$lt:value} }

</>复制代码

  1. > db.users.find({likes:{$lt:888}})
  2. { "_id" : ObjectId("5574bdf3c705777157a515ac"), "username" : "spring", "url" : "webinglin.github.io", "tags" : [ "spring", "framework" ], "likes" : 777, "author" : "linwenbin" }

小于等于

语法: {key : {$lte:value}}

</>复制代码

  1. > db.users.find({likes:{$lte:888}})
  2. { "_id" : ObjectId("5574bdd2c705777157a515ab"), "username" : "redis", "url" : "webinglin.github.io", "tags" : [ "redis", "database", "nosql" ], "likes" : 888, "author" : "linwenbin" }
  3. { "_id" : ObjectId("5574bdf3c705777157a515ac"), "username" : "spring", "url" : "webinglin.github.io", "tags" : [ "spring", "framework" ], "likes" : 777, "author" : "linwenbin" }

不等于
语法: {key : {$ne:value} }

</>复制代码

  1. > db.users.find({likes:{$ne:888}})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. { "_id" : ObjectId("5574bdf3c705777157a515ac"), "username" : "spring", "url" : "webinglin.github.io", "tags" : [ "spring", "framework" ], "likes" : 777, "author" : "linwenbin" }

且操作 AND
语法: {key1:value1, key2:value2, key3:value3 …}

</>复制代码

  1. > db.users.find({likes:{$gt:777},username:"mongo"})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. > db.users.find({likes:{$gt:777}})
  4. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  5. { "_id" : ObjectId("5574bdd2c705777157a515ab"), "username" : "redis", "url" : "webinglin.github.io", "tags" : [ "redis", "database", "nosql" ], "likes" : 888, "author" : "linwenbin" }

或操作 OR

语法: { $or: [ {key1: value1}, {key2:value2} ] } 将or条件的所有 {key:value} 都放在 $or 的value中(数组)

</>复制代码

  1. > db.users.find({$or:[{username:"mongo"},{username:"redis"}]})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. { "_id" : ObjectId("5574bdd2c705777157a515ab"), "username" : "redis", "url" : "webinglin.github.io", "tags" : [ "redis", "database", "nosql" ], "likes" : 888, "author" : "linwenbin" }

复杂条件查询

如何将所有的条件都连起来用呢?

比如我们想要这样查询 like>=888 && (username=”mongo” or username=”spring”)
由于上面的数据只有三条, 我们知道 like>=888 只有 mongo 和 redis 这两条数据满足条件, 后面的username=”mongo” or username=”spring” 又有 mongo和 spring 满足条件, 这两个and操作之后 就只剩下 mongo 这条数据满足条件了。 所以最终应该查出一条mongo的Document.

</>复制代码

  1. > db.users.find({likes:{$gte:888},$or:[{username:"mongo"},{username:"spring"}]})
  2. { "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
  3. >

find() 其他用法
Projection

mongodb中 projection 意味着显示你希望看到的字段而非所有的字段都显示,这是什么意思呢?

比如: 我们的测试数据里面有那么多的字段: username,likes,tags,author,url 而我们经常要用到的就只有 username 和 likes 那么就显示这两个字段就好了,其他的字段就别显示出来了。

find({},{KEY:1/0}) find的第二个参数,KEY为要显示或隐藏的字段,value为1表示显示,0表示隐藏,看着也很简单,试一下吧

</>复制代码


  1. > db.users.find({},{_id:0,url:0,tags:0,author:0})
  2. { "username" : "mongo", "likes" : 999 }
  3. { "username" : "redis", "likes" : 888 }
  4. { "username" : "spring", "likes" : 777 }
  5. >

limit, skip, sort

为了更好的测试分页的效果,新建一个集合,并插入30条数据

</>复制代码

  1. > for(var i=0; i<30; i++){
  2. ... db.pages.insert({"val":i});
  3. ... }
  4. WriteResult({ "nInserted" : 1 })
  5. > db.pages.find()
  6. { "_id" : ObjectId("5574ca7b192e9dda0925e37f"), "val" : 0 }
  7. { "_id" : ObjectId("5574ca7b192e9dda0925e380"), "val" : 1 }
  8. { "_id" : ObjectId("5574ca7b192e9dda0925e381"), "val" : 2 }
  9. { "_id" : ObjectId("5574ca7b192e9dda0925e382"), "val" : 3 }
  10. { "_id" : ObjectId("5574ca7b192e9dda0925e383"), "val" : 4 }
  11. { "_id" : ObjectId("5574ca7b192e9dda0925e384"), "val" : 5 }
  12. { "_id" : ObjectId("5574ca7b192e9dda0925e385"), "val" : 6 }
  13. { "_id" : ObjectId("5574ca7b192e9dda0925e386"), "val" : 7 }
  14. { "_id" : ObjectId("5574ca7b192e9dda0925e387"), "val" : 8 }
  15. { "_id" : ObjectId("5574ca7b192e9dda0925e388"), "val" : 9 }
  16. { "_id" : ObjectId("5574ca7b192e9dda0925e389"), "val" : 10 }
  17. { "_id" : ObjectId("5574ca7b192e9dda0925e38a"), "val" : 11 }
  18. { "_id" : ObjectId("5574ca7b192e9dda0925e38b"), "val" : 12 }
  19. { "_id" : ObjectId("5574ca7b192e9dda0925e38c"), "val" : 13 }
  20. { "_id" : ObjectId("5574ca7b192e9dda0925e38d"), "val" : 14 }
  21. { "_id" : ObjectId("5574ca7b192e9dda0925e38e"), "val" : 15 }
  22. { "_id" : ObjectId("5574ca7b192e9dda0925e38f"), "val" : 16 }
  23. { "_id" : ObjectId("5574ca7b192e9dda0925e390"), "val" : 17 }
  24. { "_id" : ObjectId("5574ca7b192e9dda0925e391"), "val" : 18 }
  25. { "_id" : ObjectId("5574ca7b192e9dda0925e392"), "val" : 19 }
  26. Type "it" for more

</>复制代码

  1. > db.pages.find().limit(5)
  2. { "_id" : ObjectId("5574ca7b192e9dda0925e37f"), "val" : 0 }
  3. { "_id" : ObjectId("5574ca7b192e9dda0925e380"), "val" : 1 }
  4. { "_id" : ObjectId("5574ca7b192e9dda0925e381"), "val" : 2 }
  5. { "_id" : ObjectId("5574ca7b192e9dda0925e382"), "val" : 3 }
  6. { "_id" : ObjectId("5574ca7b192e9dda0925e383"), "val" : 4 }

可以发现,如果使用 limit方法的话会显示整个集合的所有文档。 指定了 limit 之后, 显示具体的条数,上文中,limit(5) 表示, 显示5条文档。

limit方法除外,还有一个 skip 方法,skip也是接受一个整型的参数,表示查询结果跳过多少个文档。

例如上面插入的30条记录中,我们要显示18-22条记录,那么就应该使用
db.pages.find().skip(18).limit(5)

</>复制代码

  1. > db.pages.find().skip(18).limit(5)
  2. { "_id" : ObjectId("5574ca7b192e9dda0925e391"), "val" : 18 }
  3. { "_id" : ObjectId("5574ca7b192e9dda0925e392"), "val" : 19 }
  4. { "_id" : ObjectId("5574ca7b192e9dda0925e393"), "val" : 20 }
  5. { "_id" : ObjectId("5574ca7b192e9dda0925e394"), "val" : 21 }
  6. { "_id" : ObjectId("5574ca7b192e9dda0925e395"), "val" : 22 }

skip和limit的组合就能做到分页的功能了。但是如果数据量很大,理论上分页就会变得很慢了,比如有一亿条数据,要拿最后一页。那skip的数据量就很多很多了。这样就会变得比较慢。话说回来,有谁会看数据看到最后的几页?正常都是看前面几页数据,所以,skip和limit实现分页是可以接受的。

在mongodb中,如果要对查询结果排序,那么需要使用sort方法。sort方法接收一个文档参数。也就是{key:value}的形式。其中,key表示要排序的字段,value的可取值为 1 / -1 。1表示升序asc,-1表示降序desc。话不多说,直接上例子:

</>复制代码

  1. > db.pages.find().sort({val:-1})
  2. { "_id" : ObjectId("5574ca7b192e9dda0925e39c"), "val" : 29 }
  3. { "_id" : ObjectId("5574ca7b192e9dda0925e39b"), "val" : 28 }
  4. { "_id" : ObjectId("5574ca7b192e9dda0925e39a"), "val" : 27 }
  5. { "_id" : ObjectId("5574ca7b192e9dda0925e399"), "val" : 26 }
  6. { "_id" : ObjectId("5574ca7b192e9dda0925e398"), "val" : 25 }
  7. { "_id" : ObjectId("5574ca7b192e9dda0925e397"), "val" : 24 }
  8. { "_id" : ObjectId("5574ca7b192e9dda0925e396"), "val" : 23 }
  9. { "_id" : ObjectId("5574ca7b192e9dda0925e395"), "val" : 22 }
  10. { "_id" : ObjectId("5574ca7b192e9dda0925e394"), "val" : 21 }
  11. { "_id" : ObjectId("5574ca7b192e9dda0925e393"), "val" : 20 }
  12. { "_id" : ObjectId("5574ca7b192e9dda0925e392"), "val" : 19 }
  13. { "_id" : ObjectId("5574ca7b192e9dda0925e391"), "val" : 18 }
  14. { "_id" : ObjectId("5574ca7b192e9dda0925e390"), "val" : 17 }
  15. { "_id" : ObjectId("5574ca7b192e9dda0925e38f"), "val" : 16 }
  16. { "_id" : ObjectId("5574ca7b192e9dda0925e38e"), "val" : 15 }
  17. { "_id" : ObjectId("5574ca7b192e9dda0925e38d"), "val" : 14 }
  18. { "_id" : ObjectId("5574ca7b192e9dda0925e38c"), "val" : 13 }
  19. { "_id" : ObjectId("5574ca7b192e9dda0925e38b"), "val" : 12 }
  20. { "_id" : ObjectId("5574ca7b192e9dda0925e38a"), "val" : 11 }
  21. { "_id" : ObjectId("5574ca7b192e9dda0925e389"), "val" : 10 }
  22. Type "it" for more

这个是对val这个key进行逆序排序,所以value取值为-1。 那value值为1的话,就变成升序了。

</>复制代码

  1. > db.pages.find().sort({val:1})
  2. { "_id" : ObjectId("5574ca7b192e9dda0925e37f"), "val" : 0 }
  3. { "_id" : ObjectId("5574ca7b192e9dda0925e380"), "val" : 1 }
  4. { "_id" : ObjectId("5574ca7b192e9dda0925e381"), "val" : 2 }
  5. { "_id" : ObjectId("5574ca7b192e9dda0925e382"), "val" : 3 }
  6. { "_id" : ObjectId("5574ca7b192e9dda0925e383"), "val" : 4 }
  7. { "_id" : ObjectId("5574ca7b192e9dda0925e384"), "val" : 5 }
  8. { "_id" : ObjectId("5574ca7b192e9dda0925e385"), "val" : 6 }
  9. { "_id" : ObjectId("5574ca7b192e9dda0925e386"), "val" : 7 }
  10. { "_id" : ObjectId("5574ca7b192e9dda0925e387"), "val" : 8 }
  11. { "_id" : ObjectId("5574ca7b192e9dda0925e388"), "val" : 9 }
  12. { "_id" : ObjectId("5574ca7b192e9dda0925e389"), "val" : 10 }
  13. { "_id" : ObjectId("5574ca7b192e9dda0925e38a"), "val" : 11 }
  14. { "_id" : ObjectId("5574ca7b192e9dda0925e38b"), "val" : 12 }
  15. { "_id" : ObjectId("5574ca7b192e9dda0925e38c"), "val" : 13 }
  16. { "_id" : ObjectId("5574ca7b192e9dda0925e38d"), "val" : 14 }
  17. { "_id" : ObjectId("5574ca7b192e9dda0925e38e"), "val" : 15 }
  18. { "_id" : ObjectId("5574ca7b192e9dda0925e38f"), "val" : 16 }
  19. { "_id" : ObjectId("5574ca7b192e9dda0925e390"), "val" : 17 }
  20. { "_id" : ObjectId("5574ca7b192e9dda0925e391"), "val" : 18 }
  21. { "_id" : ObjectId("5574ca7b192e9dda0925e392"), "val" : 19 }
  22. Type "it" for more
  23. >

那如果要对多个值进行组合排序呢? 就好比如对于我们最初的例子 users 集合。 要对users集合进行排序。其中 按照likes升序, 按照username降序。为了达到我们的效果,我们再往users集合里面插入两条数据

</>复制代码

  1. > db.users.insert({username:"mongodb",likes:999})
  2. > db.users.insert({username:"springMVC",likes:888})

下面是运行结果,注意观察 likes为888的两个文档。发现username逆序排序了。至此,说明我们的sort实验成功了。

</>复制代码

  1. > db.users.find().sort({likes:1,username:-1}).pretty()
  2. {
  3. "_id" : ObjectId("5574bdf3c705777157a515ac"),
  4. "username" : "spring",
  5. "url" : "webinglin.github.io",
  6. "tags" : [
  7. "spring",
  8. "framework"
  9. ],
  10. "likes" : 777,
  11. "author" : "linwenbin"
  12. }
  13. {
  14. "_id" : ObjectId("5574cefa192e9dda0925e39e"),
  15. "username" : "springMVC",
  16. "likes" : 888
  17. }
  18. {
  19. "_id" : ObjectId("5574bdd2c705777157a515ab"),
  20. "username" : "redis",
  21. "url" : "webinglin.github.io",
  22. "tags" : [
  23. "redis",
  24. "database",
  25. "nosql"
  26. ],
  27. "likes" : 888,
  28. "author" : "linwenbin"
  29. }
  30. {
  31. "_id" : ObjectId("5574cef5192e9dda0925e39d"),
  32. "username" : "mongodb",
  33. "likes" : 999
  34. }
  35. {
  36. "_id" : ObjectId("5574bdabc705777157a515aa"),
  37. "username" : "mongo",
  38. "url" : "webinglin.github.io",
  39. "tags" : [
  40. "mongodb",
  41. "database",
  42. "nosql"
  43. ],
  44. "likes" : 999,
  45. "author" : "linwenbin"
  46. }
  47. >

原作者:webinglin

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18751.html

相关文章

  • MongoDB学习札记第六篇之主从复制

    摘要:系列文章请看环境准备主从复制是中最常见的复制方式。本次试验中,我们采用一个主节点,一个从节点。重启一下即可正常运行。执行完这条语句之后既可以正常操作了。具体怎么创建用户参考学习札记第二篇之安全参考权威指南官网手册 mongo系列文章请看http://www.codefrom.com/p/mongodb 环境准备: ubuntu12.0.4 mongodb3.0....

    guyan0319 评论0 收藏0
  • MongoDB干货篇之查询

    摘要:如果的值大于数组中元素的数量,该查询返回数组中的所有元素的。数组参数使用格式,其中第一个值表示在数组中跳过的项目数第二个值表示返回的项目数。 MongoDB干货篇之查询 准备工作 在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下: db.user.insertMany( [{ name:jack, age:22, sex:M...

    RdouTyping 评论0 收藏0
  • MongoDB干货篇之数据更新

    摘要:默认为如果为的话和一样的效果下面将会更新所有匹配到的数据字段更新操作符用来指定一个键的值。语法当对数组字段进行更新时,且没有明确指定的元素在数组中的位置,我们使用定位操作符标识一个元素,数字都是以开始的。 MongoDB干货篇之数据更新 原文地址 https://chenjiabing666.github... 常用的函数 update(,,,),其中表示筛选的条件,是要更新的数据 ...

    kidsamong 评论0 收藏0
  • chrome扩展开发之旅 四篇

    摘要:目录结构书签历史管理扩展与应用标签书签第一步,在中声明书签的个属性,并不是每个书签都有这个对象,如书签文件夹就不具有属性。调整书签位置更新书签删除书签和空的书签分组删除包含书签的书签分组获取完整的书签内容书签的事件第一步,先行在中声明。 目录结构 4.1 书签 4.2 Cookies 4.3 历史 4.4 管理扩展与应用 4.5 标签 4.6 overridePages 4.1 书...

    jackwang 评论0 收藏0
  • 双刃剑MongoDB学习和避坑

    摘要:双刃剑的学习和避坑是一把双刃剑,它对数据结构的要求并不高。第二某些银行显示的金额不是实时的。第三步创建封装类的管理类,针对不同的实体类,需要配置不同的。 双刃剑MongoDB的学习和避坑 MongoDB 是一把双刃剑,它对数据结构的要求并不高。数据通过key-value的形式存储,而value的值可以是字符串,也可以是文档。所以我们在使用的过程中非常方便。正是这种方便给我们埋下了一颗颗...

    everfight 评论0 收藏0

发表评论

0条评论

RebeccaZhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<