MongoDB高级查询

翻译自http://www.mongodb.org/display/DOCS/Advanced+Queries部份内容。python

其实内容并不难理解,主要照顾英语苦手的兄弟们,也方便本身。正则表达式

这里主要是讲MongoDB在控制台中如何进行高级查询,既有教程内容,也有ME动手实验的经验,搞懂了这些规则,对于你再使用其余语言(Java,ruby,python等)实现查询时有莫大的帮助,由于基础的是相通的,只是不一样的语言实现接口略有差别而已。sql

还有一句想提醒你们,多动手实验,才是硬道理。mongodb

<,>,>=,<=数据库


这四个就不用解释了,最经常使用的,也是最简单的。express

db.collection.find({ "field" : { $gt: value } } )   // 大于  : field > value数组

db.collection.find({ "field" : { $lt: value } } )   // 小于  :  field < valueruby

db.collection.find({ "field" : { $gte: value } } )  // 大于等于 : field >= valuepost

db.collection.find({ "field" : { $lte: value } } )  // 小于等于 : field <= valueui

若是要同时知足多个条件,记得要这样用:

db.collection.find({ "field" : { $gt: value1, $lt: value2 } } )    // value1 < field < value

$ne   不等于

db.things.find( { x : { $ne : 3 } } )

条件至关于x<>3,即x不等于3。

$mod    取模运算

db.things.find( { a : { $mod : [ 10 , 1 ] } } )

条件至关于a % 10 == 1 即a除以10余数为1的。

$nin  不属于

db.things.find({j:{$nin: [2,4,6]}})

条件至关于 j 不等于 [2,4,6] 中的任何一个。

$in     属于

db.things.find({j:{$in: [2,4,6]}})

条件至关于j等于[2,4,6]中的任何一个。

$all  所有属于

db.things.find( { a: { $all: [ 2, 3 ] } } )

与$in相似,但必须是[]的值所有都存在。

$size     数量,尺寸

db.things.find( { a : { $size: 1 } } )

条件至关于a的值的数量是1(a必须是数组,一个值的状况不能算是数量为1的数组)。

$exists   字段存在

db.things.find( { a : { $exists : true } } )

db.things.find( { a : { $exists : false } } )

true返回存在字段a的数据,false返回不存在字度a的数据。

$type     字段类型

db.things.find( { a : { $type : 2 } } )

条件是a类型符合的话返回数据。


参数类型以下图:


Type Name
 Type Number
 
Double
 1
 
String
 2
 
Object
 3
 
Array
 4
 
Binary data
 5
 
Object id
 7
 
Boolean
 8
 
Date
 9
 
Null
 10
 
Regular expression
 11
 
JavaScript code
 13
 
Symbol
 14
 
JavaScript code with scope
 15
 
32-bit integer
 16
 
Timestamp
 17
 
64-bit integer
 18
 
Min key
 255
 
Max key
 127
 

Regular Expressions    正则表达式

db.customers.find( { name : /acme.*corp/i } )

相似sql中的like方法。


行开始 /^ 行结束 $/


这里要特别特别特别地注意一点,关乎查询效率:

While /^a/, /^a./, and /^a.$/ are equivalent and will all use an index in the same way, the later two require scanning the whole string so they will be slower. The first format can stop scanning after the prefix is matched.

意思大概就是指在查询以a开头字符串时,能够有三种形式, /^a/, /^a./,和/^a.$/ 。后面两种形式会扫描整个字符串,查询速度会变慢。第一种形式会在查到符合的开头后中止扫描后面的字符。


因此要特别注意。


几个附加参数:


i的意思是忽略大小写。(这个很重要,很经常使用)


m的意思是支持多行。(不过ME没有尝试过)


x的意思是扩展。(也没用过)

$or  或 (注意:MongoDB 1.5.3后版本可用)

db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )

符合条件a=1的或者符合条件b=2的数据都会查询出来。


与其余字段一块儿查询:

db.foo.find( { name : "bob" , $or : [ { a : 1 } , { b : 2 } ] } )

符合条件name等于bob,同时符合其余两个条件中任意一个的数据。

Value in an Array   数组中的值


例如数据库中存在这样的数据:

{ "_id" : ObjectId("4c503405645fa23b31e11631"), "colors" : [ "red", "black" ] }

查询

db.things.find( { colors : "red" } );

便可查到上面那条数据。

$elemMatch   要素符合

t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )

结果:

{ "_id" : ObjectId("4b5783300334000000000aa9"),

  "x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]

}

x其中一个要素符合那个检索条件就能够被检索出来。(不过通常谁用像x这样的结构去保存数据呢?)

Value in an Embedded Object    内嵌对象中的值


例如数据库中存在这样的数据:

{ "_id" : ObjectId("4c503773645fa23b31e11632"), "author" : { "name" : "Dan Brown", "age" : 38 }, "book" : "The Lost Symbol" }

查询:

db.postings.find( { "author.name" : "Dan Brown" } );

便可查到上面那条数据。


查询内嵌对象的属性,记得要加上“”,字段是“author.name”,而不是author.name。

$not 不是

db.customers.find( { name : { $not : /acme.*corp/i } } );

这是一个与其余查询条件组合使用的操做符,不会单独使用。


只要你理解了前面的查询操做便可,只是再加上了$not,结果就是获得了没有$not的相反结果集。

sort()    排序


这个很是实用。即sql语言中的OrderBy。

db.myCollection.find().sort( { ts : -1 } )

也能够多个字段排序

db.myCollection.find().sort( { ts : -1 ,ds : 1 } )

这里的1表明升序,-1表明降序。


通过ME的实验,小于0的数字就是降序,0以上(包括0)就是升序。

limit()   skip()

这两个ME想连起来说,他们就是你实现数据库分页的好帮手。

limit()控制返回结果数量,若是参数是0,则看成没有约束,limit()将不起做用。

skip()控制返回结果跳过多少数量,若是参数是0,则看成没有约束,skip()将不起做用,或者说跳过了0条。

例如:

 db.test.find().skip(5).limit(5)

结果就是取第6条到第10条数据。

snapshot()   (没有尝试)

count()   条数

返回结果集的条数。

db.test.count()

在加入skip()和limit()这两个操做时,要得到实际返回的结果数,须要一个参数true,不然返回的是符合查询条件的结果总数。

例子以下:

> db.test.find().skip(5).limit(5).count()

9

> db.test.find().skip(5).limit(5).count(true)

4

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yczz/archive/2010/11/01/5978800.aspx

相关文章
相关标签/搜索