一、find操作

MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询。

1、查询全部

空的查询文档{}会匹配集合的全部内容。如果不指定查询文档,默认就是{}。

2、部分查询

3、键的筛选

键的筛选是查询时只返回自己感兴趣的键值,通过指定find的第二个参数来实现。这样可以节省传输的数据量,又能节省客户端解码文档的时间和内存消耗。

查询时,数据库所关心的查询文档的值必须是常量。

二、查询条件

1、比较查询

$lt,$lte,$gt,$gte,$ne和<,<=,>,>=,!=是一一对应的,它们可以组合起来以查找一个范围内的值。

2、关联查询

$in用于查询一个键的多个值,$nin将返回与筛选数组中所有条件都不匹配的文档。将$in与$not组合可以实现$nin相同的效果。

$or用于对多个键做or查询。

三、特定类型的查询

1、null查询

null不仅能匹配自身,还能匹配键不存在的文档。

2、正则表达式

3、数组查询

$all:通过多个元素来匹配数组。

$size:查询指定长度的数组。

$slice:返回数组的一个子集合。

4、内嵌文档查询

四、$where查询

$where查询是MongoDB的高级查询部分,可以执行任意JavaScript作为查询的一部分,是其他查询方式的一个补充。

$where查询需要将每个文档从BSON转换为JavaScript对象,然后通过$where的表达式来运行,该过程不能利用索引,所以查询速度较常规查询慢很多。如果必须使用时,可以将常规查询作为前置过滤,能够利用索引的话可以使用索引根据非$where子句进行过滤,最后使用$where对结果进行调优。另一种方式采用映射化简-MapReduce.

五、游标

游标是很有用的东西,MongoDB数据库使用游标来返回find的执行结果。客户端使用游标可以对最终结果进行有效的控制,比如分页,排序。

1、limit,skip和sort

limit:限制结果数量,限制的是上限。
skip:略过匹配到的前n个文档,然后返回余下的文档。skip略过过多的文档时会产生性能问题,建议尽量避免。
sort:按照指定的键对文档进行排序,1为升序,-1为降序。

2、高级查询选项

包装查询:使用sort,limit或skip对最终结果进行进一步的控制。

有用的配置选项:

$maxscan:integer,指定查询最多扫描的文档数量。
$min:document,查询的开始条件。
$max:document,查询的结束条件。
$hint:document,指定服务器使用哪个索引进行查询。
$explain:boolean,获取查询执行的细节(用到的索引,结果数量,耗时等),而并非真正执行查询。
$snapshot:boolean,确保查询的结果是在查询执行那一刻的一致快照,用于避免不一致读取。

包装查询会将查询条件包装到一个更大的查询文档中,比如执行如下查询时:

db.foo.find({"name":"bar"}).sort("x":1)

shell会把查询从{"name":"bar"}转换成{"$query":{"name":"bar"},"$orderby":{"x":1}},而不是直接将{"name":"bar"}作为查询文档发送给数据库。

3、游标内幕
看待游标的两种角度:客户端的游标及客户端游标表示的数据库游标(服务器端)。

在服务器端,游标消耗内存和其他资源,所以在合理的情况下需要尽快释放。服务器端导致游标终止的情况如下:

1、游标完成匹配结果的迭代时自动清除。

2、游标在客户端已不在作用域内的情况下,驱动会向服务器发送专门的消息,让其销毁游标。

3、超时销毁,可以使用immortal函数关闭游标超时时间,采用此操作一定要在迭代完结果后将游标关闭。

六、总结

使用MongoDB需要对文档结构进行合理的设计,以满足某些特定需求。比如随机选取文档,使用skip跳过随机个文档就没有在文档中加个随机键,然后使用某个随机数对文档进行查询高效,随机键还能添加索引,效率更高。合理选择,合理设计。

在MongoDB中db.collection.find()方法用于从集合中检索文档。db.collection.find()方法返回一个检索到文档的游标。db.collection.findOne()方法也执行读操作,返回一条文档。在内部实现上,db.collection.findOne()方法是db.collection.find()使用limit 1。

查询集合中的所有文档:

1.一个空的query文档({})可以查出一个集合中的所有文档:

复制代码 代码如下:
db.inventory.find( {} )

2.没有指定query文档的find()等价于指定一个空query文档的查询。因此,下面的查询和上面的查询时等价的:

复制代码 代码如下:
db.inventory.find()

指定相等条件:
使用{<field>:<value>}文档指定相等条件,查询所有包含<field>字段,值为<value>的文档。下面的例子从inventory集合中检索所有type字段值为snacks的所有文档:

复制代码 代码如下:
db.inventory.find( { type: "snacks" } )

使用query操作符指定条件:
在MongoDB中可以使用query操作符指定条件。下面的例子从inventory集合中查询type字段的值为'food'或者'snacks':

复制代码 代码如下:
db.inventory.find( { type: { $in: [ 'food', 'snacks' ] } } )

虽然这个查询可以使用$or操作符,但是对于同一个字段的相等检测使用$in而不是$or。

指定AND条件:
符合查询可以在条件中指定多个文档字段。逻辑AND连接一起的复合查询条件,查询符合所有条件的文档。下面例子中,query文档指定等于food和price字段小于($lt)指定值的查询条件:

复制代码 代码如下:
db.inventory.find( { type: 'food', price: { $lt: 9.95 } } )

这个查询选择所有type字段值等于food,而且price字段值小于9.95的文档。

指定OR条件:
使用$or操作符,可以指定一个使用逻辑OR连接的复合查询,查询选择集合中至少匹配一个条件的文档。下面的例子中,查询集合中所有qty字段值大于($gt)100或者price字段值小于($lt)9.95的文档:

复制代码 代码如下:
db.inventory.find(
    { $or: [
        { qty: { $gt: 100 } },
              { price: { $lt: 9.95 } }
      ]
    }
)

同时指定AND和OR条件:
使用更多的条件,可以指定精确的查询条件。在下面的例子中,符合query文档选择集合中所有type字段值为'food',并且qty的值大于($gt)100或者price值小于($lt)9.95的文档:

复制代码 代码如下:
db.inventory.find( { type: 'food', $or: [ { qty: { $gt: 100 } },
                                                  { price:{ $lt:9.95 } }
                                                ]
                          } )

子文档:
         当字段包含嵌入的文档(即子文档),可以指定整个子文档作为一个字段的值,或使用点符号“进入”子文件,指定该子文档的各个字段的值:
1.精确匹配子文档:
指定一个相等条件匹配整个子文档,使用query文档{<field>:<value>},<value>用于匹配子文档。“相等”匹配子文档需要子文档的字段精确匹配<value>条件,包括字段的顺序。下面的例子查询producer字段的值匹配一个仅包含值为“ABC123”的company字段和值为“123 Street”的子文档,并且有先后顺序:

复制代码 代码如下:
db.inventory.find(
                             {
                                 producer: {
                                       company: 'ABC123',
                                       address: '123 Street' }
                             }
                          )

2.子文档字段“相等”匹配:
查询集合中指定字段的子文档的字段包含指定条件的文档。下面的例子使用点符号查询producer的子文档的conmpany字段值为“ABC123”的所有文档:

复制代码 代码如下:
db.inventory.find( { 'producer.company': 'ABC123' } )

数组:
        当字段值是一个数组时,可以使用数组精确匹配或者在数组中指定值。如果数组元素是一个子文档,可以使用点符号指定字段。
精确匹配数组:
        在数组中指定相等条件,使用query文档{<field>:<value>},<value>是用于匹配的数组。数组的精确匹配需要数组的字段完全匹配指定的<value>,包括元素的顺序:

复制代码 代码如下:
db.inventory.find( { tags: [ 'fruit', 'food', 'citrus' ] } )

匹配一个数组元素:
        可以在数组中指定一个单独的元素用于"相等"匹配。这种规范匹配的数组至少需要包含一个指定的元素。下面的例子将匹所有tags是一个数组且包含"fruit"元素的文档:

复制代码 代码如下:
db.inventory.find( { tags: 'fruit' } )

匹配数组的指定元素:
        在数组中匹配指定索引或位置与条件相等的文档。下面例子中,使用点符号匹配所有tags是一个数组,且第一个元素是"fruit"的文档:

复制代码 代码如下:
db.inventory.find( { 'tags.0' : 'fruit' } )

子文档数组:

使用数组索引匹配子文档的字段:
        如果知道子文档数组的索引,就可以指定子文档的位置。下面的例子查询所有memo包含一个数组且第一个元素是一个子文档,子文档的by字段值为"shipping"的文档:

复制代码 代码如下:
db.inventory.find( { 'memos.0.by': 'shipping' } )

匹配一个字段不使用数组索引:
        如果不知道子文档的索引位置,使用点连接数组的字段名称和子文档字段名称。下面的例子查询所有memos字段是一个数组,且数组包含至少一个by字段值为"shipping"的子文档的文档:

复制代码 代码如下:
db.inventory.find( { 'memos.by': 'shipping' } )

匹配多个字段:
        为了在子文档中匹配多个字段,可以使用点符号或者$elemMatch操作符。下面的例子使用点符号查询memos字段值是一个数组,并且子文档memo字段等于"on tiem",by字段等于"shipping"的文档:

复制代码 代码如下:
db.inventory.find(
                       { 'memos.memo': 'on time', 'memos.by': 'shipping' }
                 )

下面的例子使用$elemMatch操作符查询memos字段值是一个数组,并且子文档memo字段等于"on tiem",by字段等于"shipping"的文档:

复制代码 代码如下:
db.inventory.find( {
                     memos: {
                                $elemMatch: {
                                              memo : 'on time',
                                              by: 'shipping' }
                            }
                   }
                 )

mongoDB操作2的更多相关文章

  1. 基础拾遗-----mongoDB操作

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  2. mongodb操作文件

    mongodb操作文件,主要是通过GridFS类.存储文件主要存放在fs中,其中的fs是数据库默认的.并且GridFS是直接与数据库打交道,与collection集合无关. ============= ...

  3. MongoDB操作

    创建.删除数据库 格式 use DATABASE_NAME 如果不存在,则创建,否则直接切换到该数据库 显示当前所在的数据库 db 显示所有数据库 show dbs 删除数据库 db.dropData ...

  4. PHP mongoDB 操作

    <?php /** * PHP操作MongoDB学习笔记 */ //************************* //** 连接MongoDB数据库 **// //************ ...

  5. mongodb操作之使用javaScript实现多表关联查询

    一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示:

  6. SpringMVC连接MongoDB操作数据库

    <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Soft ...

  7. mongoDB操作详细

    简介 它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等 关系型数据库中有一个 "表" 的概念,有 ...

  8. 02:MongoDB操作

    1.1 MongoDB 增加 1.插入数据 1. 插入文档: insert 如果插入数据的时候,collection还不存在,自动创建集合 2. insertOne: 插入一条数据 3. insert ...

  9. mongodb初始化并使用node.js实现mongodb操作封装

    mongodb的下载只要在https://www.mongodb.com/网站就能够下载 下载后安装只用一直点next就可以,注意最好使用默认路径安装到C盘,然后在任意位置建立一个文件夹用于储存你的数 ...

  10. NodeJS下的Mongodb操作

    今天用Node写一个小程序中需要用到数据库操作,试用了一下,发现官方的驱动已经非常好用了,也支持async. 一个简单的实例如下: const MongoClient = require('mongo ...

随机推荐

  1. Web—10-前端性能优化

    前端性能优化 从用户访问资源到资源完整的展现在用户面前的过程中,通过技术手段和优化策略,缩短每个步骤的处理时间从而提升整个资源的访问和呈现速度.网站的性能直接会影响到用户的数量,所有前端性能优化很重要 ...

  2. Java之数据类型

    Java数据类型分为基本数据类型和引用数据类型: 1.基本数据类型一共8种:byte,short,int, long,float,double,boolean和char; 具体可分为三类: ① 整数型 ...

  3. ztz11的noip模拟赛T2:查房

    链接: https://www.luogu.org/problemnew/show/U46611 思路: 这道题告你n-1条边就是骗你的 部分分也是骗你的 这道题连对边5分钟的事 一个点对另一个点有影 ...

  4. JanusGraph 图数据库安装小记 ——以 JanusGraph 0.3.0 为例

    由于近期项目中有使用图数据的需求,经过对比,我们选择尝试使用 JanusGraph.本篇小记记录了我们安装 JanusGraph 以及需要一起集成的 Cassandra + Elasticsearch ...

  5. Hadoop(二)CentOS7.5搭建Hadoop2.7.6完全分布式集群

    一 完全分布式集群(单点) Hadoop官方地址:http://hadoop.apache.org/ 1  准备3台客户机 1.1防火墙,静态IP,主机名 关闭防火墙,设置静态IP,主机名此处略,参考 ...

  6. s3c2440存储控制器详解

    从上图可知,外部内存类的设备与存储管理器相连,那么CPU是怎样访问到内存的呢?通过存储管理器.CPU比较单纯,只会按照指令执行,CPU只负责发出地址,怎样找到内存类设备呢?这些都交给存储管理器来管理. ...

  7. 【Sklearn系列】KNN算法

    最近邻分类 概念讲解 我们使用的是scikit-learn 库中的neighbors.KNeighborsClassifier 来实行KNN. from sklearn import neighbor ...

  8. 使用jenkins中遇到的问题汇总/持续更新

    jenkins产生大量日志文件 question: [DNSQuestion@1446063419 type: TYPE_IGNORE index 0, class: CLASS_UNKNOWN in ...

  9. PICT工具一键生成正交试验用例

    PICT工具一键生成正交试验用例 作用: 1.解决手动设计大量测试用例.或覆盖不全面问题,提高测试效率 2.读取excel,将生成的参数组合自动带入脚本,进行接口自动化测试 一.PICT简介 PICT ...

  10. 并查集(模板&典型例题整理)

    参考:https://blog.csdn.net/oliver233/article/details/70162173 带路径压缩模板: #include<stdio.h> ]; int ...