排序
sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
>db.COLLECTION_NAME.find().sort({KEY:1})
索引
>db.COLLECTION_NAME.ensureIndex({KEY:1})
1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
>db.col.ensureIndex({"title":1})
聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
aggregate()
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
projection operators投影算符
$
Projects the first element in an array that matches the query condition.
投影到符合查询结果的数组中的第一个元素
实例
数据:
{ "_id" : 1, "semester" : 1, "grades" : [ 70, 87, 90 ] }
{ "_id" : 2, "semester" : 1, "grades" : [ 90, 88, 92 ] }
{ "_id" : 3, "semester" : 1, "grades" : [ 85, 100, 90 ] }
{ "_id" : 4, "semester" : 2, "grades" : [ 79, 85, 80 ] }
{ "_id" : 5, "semester" : 2, "grades" : [ 88, 88, 92 ] }
{ "_id" : 6, "semester" : 2, "grades" : [ 95, 90, 96 ] }
查询:
db.students.find( { semester: 1, grades: { $gte: 85 } },
{ "grades.$": 1 }
这段查询的第二个参数,
"grades.$": 1
意味着grades数组的查询结果仅返回第一个,而1代表查询结果显示grades,并不是“第一个”的意思。而_id属性是默认显示的,如果不需要显示,则置0,如图:我们还可以应用到更新上:
不过update操作似乎只能更新一个?
$elemMatch
Projects the first element in an array that matches the specified $elemMatch condition.
投影到符合一个特定$elemMatch条件的数组的第一个结果
和前一个操作的区别是,$elemMatch应用于嵌套
示例:
{
_id: 1,
zipcode: "63109",
students: [
{ name: "john", school: 102, age: 10 },
{ name: "jess", school: 102, age: 11 },
{ name: "jeff", school: 108, age: 15 }
]
}
{
_id: 2,
zipcode: "63110",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 3,
zipcode: "63109",
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 4,
zipcode: "63109",
students: [
{ name: "barney", school: 102, age: 7 },
{ name: "ruth", school: 102, age: 16 },
]
}
在这段数据里面,students是一个对象数组,name\school\age等都是内嵌的,如果我们需要由这些属性作为查询条件的话,查询语句的格式是非常严格的。它必须包含这个对象的所有键值,且顺序必须与数据一致,否则查询结果为空。当然还有另外一种方式,譬如students.name:"ruth"
这样的查询条件可不可以呢?试验过后的确会有查询结果,然而我却发现查询的结果是无效的,系统将全部数据都呈现出来了。所以我们在此采用投影的方法。
查询:
db.schools.find( { zipcode: "63109" },
{ students: { $elemMatch: { school: 102 } } } )
结果:
{ "_id" : 1, "students" : [ { "name" : "john", "school" : 102, "age" : 10 } ] }
{ "_id" : 3 }
{ "_id" : 4, "students" : [ { "name" : "barney", "school" : 102, "age" : 7 } ] }
$meta
Projects the document’s score assigned during $text operation.
配合$text操作,$text是查找文本,假设查找'abc'那么结果会包含'aaabc' 'abccd'等
而$meta则是帮助获得更优的搜索信息
MongoDB具备一个$meta textScore
来支持评判全文检索的匹配度,越贴合搜索条件的结果,它的textScore越高。例子
$slice
Limits the number of elements projected from an array. Supports skip and limit slices.
对查询结果数组进行数量上的限制和筛选。支持跳跃分割和限定分割。
用法示例: 返回博客的前10条评论
db.blog.find({"comments":{"$slice":10}})
用法示例: 返回博客的后10条评论
db.blog.find({"comments":{"$slice":10}})
用法示例: 返回博客跳过前10条,然后返回第11 ~ 15条
db.blog.find({"comments":{"$slice":[10,5]}})
返回10条结果,从数组的倒数20个开始
db.posts.find( {}, { comments: { $slice: [ -20, 10 ] } } )