MongoDB查询技巧总结_MongoDB

在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' }
                            }
                   }
                 )

时间: 2024-09-09 07:42:02

MongoDB查询技巧总结_MongoDB的相关文章

MongoDB查询性能优化验证及验证_MongoDB

结论: 1. 200w数据,合理使用索引的情况下,单个stationId下4w数据.mongodb查询和排序的性能理想,无正则时client可以在600ms+完成查询,qps300+.有正则时client可以在1300ms+完成查询,qps140+. 2. Mongodb的count性能比较差,非并发情况下client可以在330ms完成查询,在并发情况下则需要1-3s.可以考虑估算总数的方法,http://blog.sina.com.cn/s/blog_56545fd30101442b.htm

MongoDB快速入门笔记(四)之MongoDB查询文档操作实例代码_MongoDB

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 下面给大家介绍MongoDB查询文档操作的实例 先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "

mongoDB 查询效率,等待读锁的时间差异

问题描述 mongoDB 查询效率,等待读锁的时间差异 使用mongodb做了一个项目,现在需要从项目里导出数据,第一批数据导出的时候相对比较快,第二批数据导出时突然死慢死慢.根据profile里的信息,同样的联合查询($in的集合不一样,但是大小差不多),也是加了索引的.前后两个查询要相差3倍的时间. 分析查询信息,时间基本都耗在了等待读锁上,.做了以下设想:1.通常的,如果是索引过多,那么前后的时间耗损差异,说不通(都是遍历整库查询). 2.把程序里的语句拷贝出来,本机测试,结果:可以看出,

Yii基于数组和对象的Model查询技巧实例详解_php实例

本文实例讲述了Yii基于数组和对象的Model查询技巧.分享给大家供大家参考,具体如下: 对于一个Model Post 有如下的4中查询方法,返回对象或者对象数组. //查找满足指定条件的结果中的第一行 find the first row satisfying the specified condition $post=Post::model()->find($condition,$params); //查找具有指定主键值的那一行 find the row with the specified

mongodb-使用Python怎么在MongoDB查询“距离当前时间超过30分钟”的数据??

问题描述 使用Python怎么在MongoDB查询"距离当前时间超过30分钟"的数据?? Python中用 time.time()打印出来是点小数点的,例如1449489149.56,而在mongo中查询出来的是不带小数点的,例如1442547417700 解决方案 后面是毫秒 可以直接截取掉 然后再来判断

Rogue v2.0发布 用Scala编写的MongoDB查询指定域

据国外http://www.aliyun.com/zixun/aggregation/31646.html">媒体报道,Foursquare今天在GitHub上发布了两个应用程序的代码,一个是用Scala编写的MongoDB查询指定域语言Rogue,另一个是"iOS缓存图像加载器" Full-Loaded.根据Github上的说明,Rogue对于在Lift 网络框架中使用MongoDB的开发人员将非常有用:这样的开发人员目前仍然较少,但在人数却在持续增长. Rogue

【mongodb系统学习之十】mongodb查询(一)

十.mongodb查询:find ;查询时条件中不能引用文档中其他键的值:    1).查询数据库全部数据:语法db.collectionName.find();默认只显示前20条,如图:         2).按条件查询数据:语法db.collectionName.find({"key":value});        3).只查询一条数据:findOne:       4).条件查询并指定返回的键:find后的第二个条件可以指定返回的   键,0代表不返回,其他都代表返回:另外,不

CentOS编译安装mongoDB的php扩展 MongoDB查询超时异常SocketTimeoutException

CentOS 编译安装 MongoDB与mongoDB的php扩展 下载mongo源码包,pcre,epel,js  1      #wget http://downloads.mongodb.org/src/mongodb-src-r1.8.1.tar.gz     #wget http://ftp.mozilla.org/pub/mozilla.org/js/js-1.7.0.tar.gz     #wget http://sourceforge.net/projects/pcre/file

MongoDB下根据数组大小进行查询的方法_MongoDB

注意:作者使用的mongodb版本为2.4.7. 首先插入测试数据 复制代码 代码如下: db.data.insert({name:'a', num:[12,123,22,34,1]});db.data.insert({name:'b', num:[42,22]});db.data.insert({name:'c', num:[49]}); 键num对应的值是数组. 查询num的数组值具有指定大小的document 最好的方法是使用$size,例如指定大小为2,可以: 复制代码 代码如下: db