本文主要是分享一些如何使用mongodb的api来检索文档,如还不了解mongodb,请快速参阅《入门手册》。

目录

1. Find/pretty

条件操作符

AND

OR

And & Or

in/nin

正则查询

Not

数组:all size slice .

内部文档

where

小结

2. Limit/skip/sort

3. Count

4. Distinct

5. Group

6. 聚合

7. 游标

8. 快照

9. $type


1. Find/pretty

db.persons.find().pretty()        ---结构化的方式来显示
db.persons.find ({条件},{键指定})
db.persons.find({}, {
         name : 1,
         age : 1,
         country : 1,
         _id : 0
})

条件操作符

操作

范例

RDBMS中的类似语句

等于

db.persons.find({"name":"lixiaoli"})

where by = 'lixiaoli'

小于

db.persons.find({"age":{$lt:25}})

where age< 25

小于或等于

db.persons.find({"age":{$lte:25}})

where age<= 25

大于

db.persons.find({"age":{$gt:25}})

where age> 25

大于或等于

db.persons.find({"age":{$gte:25}})

where age>= 25

不等于

db.persons.find({"age":{$ne:25}})

where age!= 25

AND

传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件

db.persons.find({
         name : "lixiaoli",
         country : "Korea"
}).pretty()

OR

条件语句使用了关键字 $or

db.persons.find({
         $or : [{
                    "name" : "lixiaoli"
                   }, {
                         "age" : 25
                   }
         ]
}).pretty()

And & Or

db.persons.find({
         "country" : "USA",
         $or : [{
                    "name" : "lixiaoli"
                   }, {
                        "age" : 25
                   }
         ]
}).pretty()

in/nin

db.persons.find({
         country : {
                   $in : ["USA", "China"]
         }
})
db.persons.find({
         country : {
                   $nin : ["USA", "China"]
         }
})

正则查询

db.persons.find({
         name : /li/i
}, {
         _id : 0,
         name : 1
})

Not

取反操作, 查询出名字中不存在”li”的学生

db.persons.find({
         name : {
                   $not : /li/i
         }
}, {
         _id : 0,
         name : 1
})

$not和$nin的区别是$not可以用在任何地方儿$nin是用到集合上的

数组:all size slice .

$all对数组内元素的顺序没有要求

db.persons.find({
         "books" : {
                   $all : ["JS","JAVA"]
         }
})

数组索引从0开始(查询第二本书是JAVA的学习信息)

db.persons.find({
         "books.1" : "JAVA"
}, {
         books : 1
})

$size条件操作符,查询数组长度

db.persons.find({
         "books" : {
                   $size : 4
         }
}, {
         books : 1
})

$slice数组截取,用复数即可,如-1表明截取最后一个;如[2,3],即跳过前两个,截取3个,如果剩余不足3个,就全部返回!

db.persons.find({}, {
         books : {
                   $slice : [1, 3]
         }
})

小技巧:喜欢的书籍数量大于3本的学生?

1.增加字段size

db.persons.update({},{$set:{size:4}},false, true)

2.改变书籍的更新方式,每次增加书籍的时候size增加1

db.persons.update({查询器},{$push:{books:”ORACLE”},$inc:{size:1}})

3.利用$gt查询

db.persons.find({size:{$gt:3}})

内部文档

查询出在K上过学的学生(问题:顺序?全部匹配?)

db.persons.find({
         "address" : {
                   "city" : "上海",
                   "area" : "普陀区XX路"
         }
})

为了解决上面顺序的问题用对象”.”的方式定位

db.persons.find({
         "address.city" : "香港",
         "address.area" : "中环XX路"
})

可能是版本问题,如果上面有问题请使用$elemMatch吧

where

复杂的查询我们就可以用$where因为它是万能,但是我们要尽量避免少使用它因为他会有性能的代价

小结

shell是个彻彻底底的JS引擎,但是一些特殊的操作要靠他的各个驱动包来完成(JAVA,NODE.JS)

2. Limit/skip/sort

db.persons.find({}).limit(2)

查询2~7条的数据

db.persons.find({}).limit(5).skip(2)

排序的数据[1,-1]

db.persons.find({}, {
         name : 1,
         age : 1
}).sort({
         age : 1
})

注意:

  • mongodb的key可以存不同类型的数据排序就也有优先级

最小值>null>数字>字符串>对象/文档>数组>二进制>对象ID>布尔>日期>时间戳 >正则>最大值

  • skip有性能问题,没有特殊情况下我们也可以换个思路,每次查询操作的时候前后台传值全要把上次的最后一个文档的日期保存下来,db.persons.find({date:{$gt:日期数值}}).limit(3)

3. Count

请查询persons中美国学生的人数.

db.persons.find({country:"USA"}).count()

4. Distinct

请查询出persons中一共有多少个国家分别是什么.

db.runCommand({
         distinct : "persons",
         key : "country"
}).values

5. Group

请查出persons中每个国家学生数学成绩最好的学生信息(必须在90以上)

db.runCommand({group:{ns:"persons",key:{"country":true},initial:{m:0},$reduce:function(doc,prev){if(doc.m > prev.m){prev.m = doc.m;prev.name = doc.name;prev.country = doc.country;}},condition:{m:{$gt:90}}
}})

把个人的信息链接起来写一个描述赋值到m上

finalize:function(prev){
    prev.m = prev.name+" Math scores "+prev.m
}

如果集合中出现键Counrty和counTry同时存在那分组有点麻烦这要如何解决呢?

db.runCommand({group:{ns:"persons",$keyf:function(doc){if(doc.counTry){return {country:doc.counTry}}else{return {country:doc.country}}},initial:{m:0},$reduce:function(doc,prev){if(doc.m > prev.m){prev.m = doc.m;prev.name = doc.name;if(doc.country){prev.country = doc.country;}else{prev.country = doc.counTry;}}},finalize:function(prev){prev.m = prev.name+" Math scores "+prev.m},condition:{m:{$gt:90}}
}})

6. 聚合

主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果

db.persons.aggregate([{
                            $group : {
                                     _id : "$country",
                                     total_num : {
                                               $sum : 1
                                     }
                            }
                   }
         ])

表达式

描述

实例

$sum

计算总和。

db. persons.aggregate([{$group : {_id : "$country",total_num : {$sum : "$age"}}}])

$avg

计算平均值

db. persons.aggregate([{$group : {_id : "$country",total_num : {$avg : "$age"}}}])

$min

获取集合中所有文档对应值得最小值。

db. persons.aggregate([{$group : {_id : "$country", total_num : {$min : "$age"}}}])

$max

获取集合中所有文档对应值得最大值。

db. persons.aggregate([{$group : {_id : "$country", total_num : {$max : "$age"}}}])

$push

在结果文档中插入值到一个数组中。

db. persons.aggregate([{$group : {_id : "$country", names : {$push: "$name"}}}])

$addToSet

在结果文档中插入值到一个数组中,但不创建副本。

db. persons.aggregate([{$group : {_id : "$country", names: {$addToSet : "$name"}}}])

$first

根据资源文档的排序获取第一个文档数据。

db. persons.aggregate([{$group : {_id : "$country", first_name : {$first : "$name"}}}])

$last

根据资源文档的排序获取最后一个文档数据

db. persons.aggregate([{$group : {_id : "$country", last_name : {$last : "$name"}}}])

管道操作(参考管道)

db.persons.aggregate(
    { $project : {
        name : 1 ,
        country : 1 ,
    }}
 )

获取年龄大于20小于或等于50记录,然后将结果集再送到$group管道操作符进行处理

db.persons.aggregate([{$match : {age : {$gt : 20,$lte : 50}}}, {$group : {_id : "country",count : {$sum : 1}}}])

7. 游标

var persons = db.persons.find();
while (persons.hasNext()) {
         obj = persons.next();
         print(obj.name)
}

游标销毁条件

  1. 客户端发来信息叫他销毁
  2. 游标迭代完毕
  3. 默认游标超过10分钟没用也会别清除

8. 快照

为什么要用查询快照?

快照后就会针对不变的集合进行游标运动了,看看使用方法.

db.persons.find({
         $query : {
                   name : "lixiaoli"
         },
         $snapshot : true
})

高级查询选项

$query

$orderby

$maxsan:integer 最多扫描的文档数

$min:doc  查询开始

$max:doc  查询结束

$hint:doc   使用哪个索引

$explain:boolean  统计

$snapshot:boolean 一致快照

9. $type

$type操作符是基于BSON类型来检索集合中匹配的数据类型。

类型

数字

备注

Double

1

String

2

Object

3

Array

4

Binary data

5

Undefined

6

已废弃。

Object id

7

Boolean

8

Date

9

Null

10

Regular Expression

11

JavaScript

13

Symbol

14

JavaScript (with scope)

15

32-bit integer

16

Timestamp

17

64-bit integer

18

Min key

255

Query with -1.

Max key

127

db.persons.find({
         "name" : {
                   $type : 2
         }
})

mongodb数据检索大全相关推荐

  1. mongodb查询大全mongo语句

    mongodb查询大全mongo语句 一.前言 虽然这些语句在开发当中不会使用,因为springdataMongoDB封装的非常完美了.但是这里的语句思想和关系型数据库有些区别,所以需要拿出来详细的讲 ...

  2. MongoDB资料大全

    摘要: 为了帮助大家进一步了解MongoDB,云栖社区组织翻译了GitHub Awesome MongoDB 资源,涵盖MongoDB中常见的库与工具.应用列表.以及相关的文档.教程等资源. Mong ...

  3. 史上最详细的MongoDB操作命令大全

    文章目录 一.简介 二.设计特征 三.使用原理 四.MongoDB常见类型 五.数据库操作 1.显示数据库列表 2.切换或创建数据(有则切换,无则创建) 3.删除数据库 六.集合操作 1.创建集合 2 ...

  4. MongoDB知识大全

    1.安装 安装程序 将以下配置加入到与bin目录统计命名为mongo.conf dbpath=d:\mongoDB\data #日志输出文件路径 logpath=d:\mongoDB\logs\mon ...

  5. linux 安装mongodb 64,在CentOS 6.x 64bit上安装MongoDB 3.2社区版

    基本安装步骤 参考: https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 1) 创建repo源文件: sudo v ...

  6. php mongodb 手册,mongodb技术手册 - Lamp资深讲师|lamp小强|linux|php|javascript - OSCHINA - 中文开源技术交流社区...

    mongodb技术手册: ------------------------------手册--------------------------------- mongodb增.删.改和查-李强强.pd ...

  7. 2017年3月份前端资源分享

    平日学习接触过的网站积累,以每月的形式发布.2017年以前看这个网址:http://www.kancloud.cn/jsfron... 03月份前端资源分享 1. Javascript 1754535 ...

  8. pythonweb项目微服务_python web微服务器端

    awesome asyncio-精选python异步框架清单集合 Python 3.4引入标准库的Python asyncio模块提供了使用协程编写单线程并发代码,通过套接字和其他资源对I / O进行 ...

  9. python脚本迁移数据库_Django 数据库迁移脚本

    django修改模型后更新数据库 当django改变模型过后,需要重新更新数据库,更新方法如下 比如app的名字是rango python manage.py makemigrations rango ...

  10. python实现监控数据界面_python 监控界面

    MySQL MTOP - 开源 MySQL 企业监控系统 MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统.系统由Python实现多进程数据采集和告警,PHP实现WEB展示 ...

最新文章

  1. linux maps,linux下/proc/pid/maps和pmap命令详解
  2. 移动端重构系列1——前期准备工作
  3. Forefront_TMG_2010-TMG发布SSL OWA Exchange 2010
  4. python commands_Windows环境下使用python的commands.getstatusoutput
  5. 通过kubeadm安装kubernetes 1.13.2
  6. 宇宙是否可以了解,宇宙和计算机科学有关系吗?
  7. linux shell 之 crontab(定时任务)详解
  8. 当内存512遇上Access数据库600M,IO磁盘受伤了
  9. 【机器学习】机器学习中无意识偏见的分析与预防
  10. 色彩对比广告设计_为什么我们都需要使用色彩对比检查器
  11. 解读全部二十三种设计模式(附测试代码)
  12. 深入理解Plasma(四):Plasma Cash
  13. 我的世界 win10c语言版,Minecraft Win10版下载
  14. 《大掌门》欧阳刘彬--基于Cocos2d-x引擎开发经验分享
  15. FastRTPS - eProsima FASTRTPSGEN Manual
  16. 叩响港交所大门,KK集团能否成为“中国版秋叶原”?
  17. 数学建模竞赛必须要掌握的十个算法
  18. 从输入 URL 开始,聊一聊浏览器、网络等相关的知识
  19. 基于FPGA的DDS直接数字频率合成器,频率和相位控制字可配置,在vivado2019.2平台中verilog开发.含testbench
  20. 【面试大全-MQ】-消息队列

热门文章

  1. Docker数据管理:data container
  2. matlab 隐函数全微分,求隐函数的全微分
  3. 造梦西游4手游服务器维护,造梦西游4手机版常见问题解答 新手看过来
  4. 利用python-pptx包批量修改ppt格式
  5. 7-3 约分最简分式
  6. Flask debug模式算pin码
  7. SGX Enable
  8. 网页如何实现平均分成左右两部分
  9. 前端多语言开发,如何中英文切换
  10. 实时时钟芯片DS1302