,然后选择那些符合查询语句的文档。若需要 mongod 来处理大量数据,扫描是非常低效的。
索引是特殊的数据结构,存储在一个易于设置遍历形式的数据的一小部分。索引存储在索引中指定特定字段的值或一组字段,并排序字段的值。
要创建索引,需要使用MongoDB的ensureIndex()方法。
语法
ensureIndex()方法的基本语法如下
?
>db.COLLECTION_NAME.ensureIndex({KEY:1})
这里键是要创建索引字段,1是按名称升序排序。若以按降序创建索引,需要使用 -1.
?
例子:
?
>db.mycol.ensureIndex({"title":1})
>
在 ensureIndex()方法,可以通过多个字段,来创建多个字段索引。
?
>db.mycol.ensureIndex({"title":1,"description":-1})
ensureIndex() 方法还接受选项列表(这是可选),其列表如下:
?
参数 类型 描述
background
Boolean
构建索引在后台以便建立索引不阻止其它
数据库活动。指定true时建立在后台。缺省值是false.
unique
? ? Boolean
创建一个唯一的索引,以使集合将不接受插入的的文档,其中的索引关键字或键匹配索引的现有值。指定true以创建唯一索引。缺省值是 false.
name
? ?string
? 索引的名称。如果未指定,MongoDB通过连接索引的字段和排序顺序的名称生成一个索引名。
dropDups ? ? ? ? ? ? ? ?Boolean
创建一个字段唯一索引时可能会有重复。MongoDB索引键仅第一次出现,并从集合中删除包含该键后续出现的所有文档。指定true以创建唯一索引。缺省值是 false.
sparse ? ? ? ? ? ? ? ? ? ?Boolean
如果为true,索引只引用与指定的字段的文档。这些索引使用更少的空间,但在某些情况下表现不同(特别是排序)。缺省值是 false.
expireAfterSeconds ?integer
指定的值,以秒为单位,作为一个TTL控制MongoDB保留在此集合文件多久。
v ? ? ? ? ? ? ? ? ? ? ? ? ? ?index version
索引版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights ? ? ? ? ? ? ? ? ? document ? ? ? ? ? ? ? ? ? 重量(weight )是一个数字,它是从1至99,999的数字,表示字段相对于其它索引字段在得分方面的意义。
default_language ? ? string
对于文本索引,并为词干分析器和标记生成器列表中的语言决定了停用词和规则。它的默认值: english.
language_override ? string
对于一个文本索引,包含在文档中指定字段的名称,语言来覆盖默认语言。它的默认值:language.
?
?
15、MongoDB 聚合
?
聚合操作处理数据记录并返回计算结果。从多个文档聚合分组操作数值,并可以执行多种对分组数据业务返回一个结果。 在SQL中的count(*),使用group by 与mongodb的聚合是等效的。 对于MongoDB的聚合,使用的是aggregate()方法。
语法
aggregate()方法的基本语法如下
?
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
例子:
?
在集合中有以下数据:
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'Yiibai Yiibai ',
url: 'http://www.yiibai.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'Yiibai Yiibai',
url: 'http://www.yiibai.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
}
?
现在从上面的集合,如果想知道每一个用户编写的教程是多少,那么使用aggregate()方法,如下图所示的列表:
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
"result" : [
{
"_id" : "Yiibai Yiibai",
"num_tutorial" : 2
},
{
"_id" : "Neo4j",
"num_tutorial" : 1
}
],
"ok" : 1
}
>
?
用于上述用途将等效于sql查询: select by_user, count(*) from mycol group by by_user
?
另外,在上述例子中,我们已经使用字段by_user进行分组并计算总和,也就是by_user 出现各个次数。一个列表中可用的聚集表达式。
?
表达式 描述 ? ? ? ? ? ? ? ? ?示例
$sum
从集合累加所有文档中的定义值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avg
从集合中的所有文档计算所有给定值的平均值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$min
从集合中获取的所有文件的最小的相应值
? ? ? ? db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max
从集合中的所有文档中的相应值中获取最大值
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$push
插入数组值到文档中
db.myc