在前面增删改查的例子里看到几个不知道的函数,这一节来看看他们都是什么意思。mongondb听起来很高大上,单终归是一个数据库,增删改查是核心功能,这一节重点看看他的查询包括符合查询。其实到这里,我感受最深的是mongondb作为关系性数据库的替代品还是很好上手的,至少比redis更容易让我理解。

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

测试数据:

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

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

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

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

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

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

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

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

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

小于等于

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

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

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

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

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

> db.users.find({likes:{$gt:777},username:"mongo"})
{ "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }> db.users.find({likes:{$gt:777}})
{ "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
{ "_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中(数组)

> db.users.find({$or:[{username:"mongo"},{username:"redis"}]})
{ "_id" : ObjectId("5574bdabc705777157a515aa"), "username" : "mongo", "url" : "webinglin.github.io", "tags" : [ "mongodb", "database", "nosql" ], "likes" : 999, "author" : "linwenbin" }
{ "_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.

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

find() 其他用法
Projection

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

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

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

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

limit, skip, sort

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

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

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

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

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

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

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

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

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

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

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

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

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

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

> db.users.find().sort({likes:1,username:-1}).pretty()
{"_id" : ObjectId("5574bdf3c705777157a515ac"),"username" : "spring","url" : "webinglin.github.io","tags" : ["spring","framework"],"likes" : 777,"author" : "linwenbin"
}
{"_id" : ObjectId("5574cefa192e9dda0925e39e"),"username" : "springMVC","likes" : 888
}
{"_id" : ObjectId("5574bdd2c705777157a515ab"),"username" : "redis","url" : "webinglin.github.io","tags" : ["redis","database","nosql"],"likes" : 888,"author" : "linwenbin"
}
{"_id" : ObjectId("5574cef5192e9dda0925e39d"),"username" : "mongodb","likes" : 999
}
{"_id" : ObjectId("5574bdabc705777157a515aa"),"username" : "mongo","url" : "webinglin.github.io","tags" : ["mongodb","database","nosql"],"likes" : 999,"author" : "linwenbin"
}
>

MongonDB学习笔记(一)查询相关推荐

  1. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

  2. mysql的sqlyog学习笔记(查询部分)(代码用命令行显示 )

    索引 语言 查询 基础查询 select 查询列表 from 表名; 查询函数(调用函数,获取返回值) 起别名 +的作用 distinct的使用(去重) 查看表的结构 条件查询 按关系表达式筛选 按逻 ...

  3. Idoc学习笔记----获取查询Idoc信息

    这两天需要实现一个idoc的查询功能,也就是类似于WE09那样的功能能,于是学习了一下如何实现.简单记录如下: 一,Idoc的Control record信息存储在EDIDC这个表中,从这个表中我们可 ...

  4. SQL学习笔记——Select查询语句

    使用数据库和表的主要目的是存储数据以便在需要时进行检索.统计或组织输出. SELECT 语句,它是 T-SQL 的核心.从数据库中检索行,并允许从一个或多个表中选择一个 或多个行或列. 虽然 SELE ...

  5. oracle SQL以结尾函数,Oracle学习笔记--SQL查询和SQL函数(转) -- 迷失de天空 -- 编程爱好者......

    A: 数据定义语言: 用于改变数据库结构,包括创建,修改,删除数据库对象 创建表: Create Table 表名 ( 列名 列类型, 列名 列类型, -- ) 例: Create Table ven ...

  6. 【MaxCompute】学习笔记常用查询sql

    SELECT 查询 命令格式 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE whe ...

  7. mysql 学习笔记13 查询语句强化

    使用控制语句计算员工年工资 查询入职时间,晚于1982年1月1日的,(日期是可以进行比较的) where中like的使用 select name, sal from users where like ...

  8. Hibernate学习笔记_查询

    HQL vs EJBQL 1         NativeSQL >HQL.> EJBQL(JPQL 1.0) > QBC(Query By Criteria) > QBE(Q ...

  9. python天气查询_Python学习笔记——天气查询代码

    天气查询代码1 # 此程序无法运行,因为中国天气网的api接口被关闭了 import urllib.request import json import pickle #建立城市字典 pickle_f ...

最新文章

  1. Redis-Cluster实战--4.官方安装(含视频)
  2. matlab模拟gpd,如何用ARMA模型预测中国GDP
  3. mysql:Column id cannot be null
  4. numpy(1)-numpy.ndarray
  5. Linux的ps aux/ps -ef:风格不同
  6. 【Node.js】http-server 实现目录浏览服务
  7. 丹麦奥尔堡大学计算机系博士,丹麦奥尔堡大学招收计算机全奖PHD
  8. NoSQL数据库Redis使用命令简介
  9. 【课题报告】OpenCV 抠图项目实战(10)PyQt5 使用
  10. I/O(输入/输出)---序列化与反序列化
  11. android studio 横幅,有关 android studio notification 横幅弹出的功能没有反应
  12. python学习day07-encode和decode
  13. Microsoft SQL server 2005的基本操作
  14. iOS Swift-元组tuples(The Swift Programming Language)
  15. SquashFs工具制作
  16. STL容器:list双向链表学习
  17. MySQL之数据库操作
  18. 使用NanoHttpd实现简易WebServer
  19. js判断鼠标单击或者双击事件
  20. 《DSP using MATLAB》Problem 7.16

热门文章

  1. 翻译利器QTranslate
  2. Python中的10个常见安全漏洞及修复方法
  3. ESTABLISHED状态
  4. WebApp开发----数字角标
  5. hibernate查询方法query.setResultTransformer
  6. 推进700M产业链成熟,打响5G专网应用第一枪
  7. python+selenium多线程与多进程爬虫
  8. IPHONE 4完美越狱(转)
  9. 微服务版单点登陆系统(SSO)
  10. QQ并没有和我们一起成长