服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - MongoDB - MongoDB查询技巧总结

MongoDB查询技巧总结

2020-04-24 15:42MongoDB教程网 MongoDB

这篇文章主要介绍了MongoDB查询技巧总结,例如AND、OR条件查询,子文档查询等,需要的朋友可以参考下

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

 

延伸 · 阅读

精彩推荐
  • MongoDBWindows下MongoDB配置用户权限实例

    Windows下MongoDB配置用户权限实例

    这篇文章主要介绍了Windows下MongoDB配置用户权限实例,本文实现需要输入用户名、密码才可以访问MongoDB数据库,需要的朋友可以参考下 ...

    MongoDB教程网3082020-04-29
  • MongoDBMongoDB的索引

    MongoDB的索引

    数据库中的索引就是用来提高查询操作的性能,但是会影响插入、更新和删除的效率,因为数据库不仅要执行这些操作,还要负责索引的更新 ...

    MongoDB教程网2532020-05-12
  • MongoDBMongodb索引的优化

    Mongodb索引的优化

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。接下来通过本文给大家介绍Mongodb索引的优化,本文介绍的非常详细,具有参考借鉴价值,感...

    MRR3252020-05-05
  • MongoDBmongodb数据库基础知识之连表查询

    mongodb数据库基础知识之连表查询

    这篇文章主要给大家介绍了关于mongodb数据库基础知识之连表查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mongodb具有一定的参...

    ZJW02155642020-05-22
  • MongoDBMongoDB多条件模糊查询示例代码

    MongoDB多条件模糊查询示例代码

    这篇文章主要给大家介绍了关于MongoDB多条件模糊查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值...

    浅夏晴空5902020-05-25
  • MongoDBMongoDB系列教程(五):mongo语法和mysql语法对比学习

    MongoDB系列教程(五):mongo语法和mysql语法对比学习

    这篇文章主要介绍了MongoDB系列教程(五):mongo语法和mysql语法对比学习,本文对熟悉Mysql数据库的同学来说帮助很大,用对比的方式可以快速学习到MongoDB的命...

    MongoDB教程网3252020-05-01
  • MongoDBMongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)

    这篇文章主要给大家介绍了关于MongoDB查询之高级操作(多条件查询、正则匹配查询等)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者...

    w田翔3872020-12-19
  • MongoDB在mac系统下安装与配置mongoDB数据库

    在mac系统下安装与配置mongoDB数据库

    这篇文章主要介绍了在mac系统下安装与配置mongoDB数据库的操作步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    CXYhh1219312021-11-14