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的所有文档:


使用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( { ‘producer.company’: ‘ABC123’ } )


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

db.inventory.find( { ‘tags.0’ : ‘fruit’ } )


子文档数组:


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

db.inventory.find( {
                     memos: {
                                $elemMatch: {
                                              memo : ‘on time’,
                                              by: ‘shipping’ }
                            }
                   }
                 )


数据运维技术 » MongoDB查询技巧总结