其它语法补充(排序、投影等)

排序

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 ] } } )
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容