美文网首页
其它语法补充(排序、投影等)

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

作者: 灯不梨喵 | 来源:发表于2017-12-24 00:47 被阅读0次

    排序

    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 ] } } )
    

    相关文章

      网友评论

          本文标题:其它语法补充(排序、投影等)

          本文链接:https://www.haomeiwen.com/subject/amfcgxtx.html