MongoDB文档查询操作(一)

上篇文章我们主要介绍了MongoDB的修改操作,本文我们来看看查询操作。

本文是MongoDB系列的第五篇文章,了解前面的文章有助于更好的理解本文:


find方法再探

find方法是很重要的一个查询方法,我们在前面也已经使用过多次了,一般情况下我们调用的是:

find()

没有传入任何参数,这个等价于:

find({})

都表示没有查询条件,查询所有的数据。如果有查询条件,我们传入查询条件即可,查询条件也是一个文档,如下表示查询x为1的文档:

db.sang_collect.find({x:1})

如果查询条件文档中有多个字段,多个字段之间的关系是AND,如下表示查询x为1并且y为99的文档:

db.sang_collect.find({x:1,y:99})

默认情况下,每次查询都会返回文档中所有的key/value对,我们也可以自定义返回的字段,如下表示只返回x字段,其他字段都不返回:

db.sang_collect.find({},{x:1})

参数1表示返回某一个字段,0表示不返回某一个字段,当我们设置只返回x的时候,_id默认还是返回的,如果不想返回_id,我们可以设置_id为0,如下:

db.sang_collect.find({},{x:1,_id:0})

此时返回的数据中就不包括_id字段了。

各种查询条件

比较运算符

这里的比较运算符都比较好理解,如下表:

<

比如我想查询所有成绩在[90,100]之间的学生:

原始数据如下:

/* 2 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a666"),
    "name" : "zs",
    "score" : 100.0
}

/* 3 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a667"),
    "name" : "ls",
    "score" : 90.0
}

/* 4 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a668"),
    "name" : "ww",
    "score" : 70.0
}

/* 5 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a669"),
    "name" : "zl",
    "score" : 80.0
}

查询操作如下:

db.sang_collect.find({score:{$lte:100,$gte:90}})

查询结果如下:

/* 1 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a666"),
    "name" : "zs",
    "score" : 100.0
}

/* 2 */
{
    "_id" : ObjectId("59f0b17249fc5c9c2412a667"),
    "name" : "ls",
    "score" : 90.0
}

如果要查询分数不为90的学生,操作如下:

db.sang_collect.find({score:{$ne:90}})

nin

$in有点类似于SQL中的in关键字,表示查询某一个字段在某一个范围中的所有文档,比如我想查询x为1或者2的所有文档,如下:

db.sang_collect.find({x:{$in:[1,2]}})

in恰好相反,表示查询某一个字段不在某一个范围内的所有文档,比如我想查询x不为1或者2(不为1且不为2)的所有文档,如下:

db.sang_collect.find({x:{$nin:[1,2]}})

$or

$or有点类似于SQL中的or关键字,表示多个查询条件之间是的关系,比如我想查询x为1或者y为99的文档,如下:

db.sang_collect.find({$or:[{x:1},{y:99}]})

$type

$type可以用来根据数据类型查找数据,比如我想要查找x类型为数字的文档,如下:

db.sang_collect.find({x:{$type:1}})

1表示数字,其他数据类型对应的数字参见下表。

类型

对应数字

别名

说明

Double1

1

double

String

2

string

Object

3

object

Array

4

array

Binary data

5

binData

Undefined

6

undefined

弃用

ObjectId

7

objectId

Boolean

8

bool

Date

9

date

Null

10

null

Regular Expression

11

regex

DBPointer

12

dbPointer

JavaScript

13

javascript

Symbol

14

symbol

JavaScript(with scope)

15

javascriptWithScope

32-bit integer

16

int

Timestamp

17

timestamp

64-bit integer

18

long

Min key

-1

minKey

Max key

127

maxKey

$not

$not用来执行取反操作,比如我想要查询所有x的类型不为数字的文档,如下:

db.sang_collect.find({x:{$not:{$type:1}}})

$and

$and类似于SQL中的and,比如我想查询y大于98并且小于100的数据,如下:

db.sang_collect.find({$and:[{y:{$gt:98}},{y:{$lt:100}}]})

上面的操作我们也可以使用下面简化的写法:

db.sang_collect.find({y:{$lt:100,$gt:98}})

好了,MongoDB中的查询操作还是非常丰富的,本文我们先说到这里,下篇文章我们继续介绍,小伙伴们有问题欢迎留言讨论。

参考资料:

1.《MongoDB权威指南第2版》

原文发布于微信公众号 - 玩转JavaEE(gh_d1ca11234a30)

原文发表时间:2017-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏专注 Java 基础分享

Hibernate框架学习之注解映射实体类

     前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置...

2159
来自专栏JavaEdge

为什么java中用枚举实现单例模式会更好代码简洁

代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象。虽然这种问题通过...

5324
来自专栏博客园

设计模式学习-单例模式

但是这么做不感觉有问题吗?假如这个类我们并不使用或在程序启动很久以后我们才使用,那么这个对象的预创建不就很浪费吗?并且如果这个对象的创建需要很大的资源,那......

753
来自专栏IT可乐

Java设计模式之(一)------单例模式

1、什么是单例模式?   采取一定的办法保证在整个软件系统中,单例模式确保对于某个类只能存在一个实例。有如下三个特点:   ①、单例类只能有一个实例   ②、单...

2177
来自专栏java 成神之路

多线程并发下的单例模式

3857
来自专栏AhDung

【C#】递归搜索指定目录下的指定项目(文件或目录)

---------------更新:201411201121---------------

1252
来自专栏程序猿DD

漫画:什么是单例模式?(整合版)

————— 第二天 ————— 单例模式第一版: public class Singleton { private Singleton() {} ...

22910
来自专栏IMWeb前端团队

Redux源码解析系列(四)-- combineReducers

本文作者:IMWeb 黄qiong 原文出处:IMWeb社区 未经同意,禁止转载 combindeReducer 字面意思就是用来合并reducer的...

1987
来自专栏杨建荣的学习笔记

MySQL中需要注意的字段长度问题

在MySQL的表结构设计中,突然想起来几个地方碰到的问题比较多,大体来说一个就是字符集,一个就是数据类型。 而字符集和数据类型结合起来,就有一个蛮有意思的细节,...

3996
来自专栏Fish

android文件存储

为了输出数据,要把list中存储的写到一个txt文件里,就顺手学了一下 文件存储的方法,说是学,其实又是百度之后复制粘贴。不过学到了一个关于java中的一个知识...

2299

扫码关注云+社区

领取腾讯云代金券