zoukankan      html  css  js  c++  java
  • mongoDB查询、索引与聚合

    整理来自

    https://www.shiyanlou.com/courses/running/77

    初始化mongodb数据库

    > use Chenshi
    switched to db Chenshi
    > db.createCollection("shiyanlou")            #无参数
    {"ok":1}
    > show collections
    shiyanlou
    system.indexes
    > userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })        
    > userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] })    
    > doc=({"name":"peter","position":"teacher"})
    > db.shiyanlou.insert(userdoc1)
    WriteResult({"nInserted":1})
    > db.shiyanlou.insert(userdoc2)
    WriteResult({"nInserted":1})
    > db.shiyanlou.insert(doc1)
    WriteResult({"nInserted":1})

    查询语句

    db.COLLECTION_NAME.find(Parameter)范例:

    > db.shiyanlou.find()
    

    文档信息,这条指令相当于sqlite中的SELECT * FROM TABLE_NAME

    条件操作符1

    mongodb中的条件操作符有:

    • (>) 大于 - $gt #greate
    • (<) 小于 - $lt #low
    • (>=) 大于等于 - $gte #equal
    • (<= ) 小于等于 - $lte

    范例:

    > db.shiyanlou.find({user_id:{$gt:1}})
    > db.shiyanlou.find({user_id:{$lte:2,$gt:1}})

    条件操作符2

    语法:

    $type
    

    type的值:

    • 双精度型-1
    • 字符串-2
    • 对象-3
    • 数组-4
    • 二进制数据-5
    • 对象ID-7
    • 布尔类型-8
    • 数据-9
    • 空-10
    • 正则表达式-11
    • JS代码-13
    • 符号-14
    • 有作用域的JS代码-15
    • 32位整型数-16
    • 时间戳-17
    • 64位整型数-18
    • Min key-255
    • Max key-127

    范例:

    > db.shiyanlou.find({"name":{$type:2}})
    

    查找name是字符串的文档记录

    limit与skip

    读取指定数量的数据记录 -limit

    范例:

    > db.shiyanlou.find().limit(1)
    

    读取一条记录,默认是排在最前面的那一条被读取

    读取时跳过指定数量的数据记录 -skip

    范例:

    > db.shiyanlou.find().limit(1).skip(1)
    

    当然,还可以添加find的查找条件的参数,以便进行更精确的查找

     

    MongoDB排序 -sort()

    与sqlite中的排序一样有升序和降序,其中升序用1表示,降序用-1表示 语法:

    db.COLLECTION_NAME.find().sort({KEY:1|-1})
    

    范例:

    > db.shiyanlou.find().sort({"time":1})

    索引 - ensureIndex()

    索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,无疑对网站的性能是非常致命的。

    索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构。

    语法:

    db.COLLECTION_NAME.ensureIndex({KEY:1|-1})
    

    同样1代表升序,-1代表降序

    范例:

    > db.shiyanlou.ensureIndex({"name":1})
    

    ensureIndex()的可选参数:

    参数类型描述
    background Boolean 建立索引要不要阻塞其他数据库操作,默认为false
    unique Boolean 建立的索引是否唯一,默认false
    name string 索引的名称,若未指定,系统自动生成
    dropDups Boolean 建立唯一索引时,是否删除重复记录,默认flase
    sparse Boolean 对文档不存在的字段数据不启用索引,默认false
    expireAfterSeconds integer 设置集合的生存时间,单位为秒
    v index version 索引的版本号
    weights document 索引权重值,范围为1到99999
    default-language string 默认为英语
    language_override string 默认值为 language

    范例:

    > db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})
    

    四、聚合 -aggregate()

    语法:

    db.COLLECTION_NAME.aggregate({
    $match:{x:1},
    {limit:NUM},
    $group:{_id:$age}
    })
    

    这些参数都可选

    • $match:查询,跟find一样;
    • $limit:限制显示结果数量;
    • $skip:忽略结果数量;
    • $sort:排序;
    • $group:按照给定表达式组合结果。

    范例:

    > db.shiyanlou.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])
    

    $name意为取得name的值

    聚合表达式

    名称描述
    $sum 计算总和
    $avg 计算平均值
    $min和$max 计算最小和最大值
    $push 在结果文档中插入值到一个数组
    $addToSet 在结果文档中插入值到一个数组,但不创建副本
    $first 根据资源文档的排序获取第一个文档数据
    $last 根据资源文档的排序获取最后一个文档数据

    管道

    MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

    表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。 聚合框架中常用的几个操作:

    • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
    • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
    • $limit:用来限制MongoDB聚合管道返回的文档数。
    • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
    • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
    • $group:将集合中的文档分组,可用于统计结果。
    • $sort:将输入文档排序后输出。
    • $geoNear:输出接近某一地理位置的有序文档。

    范例:

    > db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
    {"_id":"user","count":2}
     
     
  • 相关阅读:
    (原创)c#学习笔记10--定义类成员01--成员定义06--自动属性
    (原创)c#学习笔记10--定义类成员01--成员定义03--定义属性
    (原创)c#学习笔记10--定义类成员01--成员定义02--建立方法
    【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
    【BZOJ3110】K大数查询(ZJOI2013)-整体二分+线段树
    【HDU5412】CRB and Queries-整体二分:带修改区间第K小
    【HDU5412】CRB and Queries-整体二分:带修改区间第K小
    【NOI2007T2】货币兑换-DP斜率优化+CDQ分治
    【NOI2007T2】货币兑换-DP斜率优化+CDQ分治
    【BZOJ3295】动态逆序对(CQOI2011)-CDQ分治:三维偏序
  • 原文地址:https://www.cnblogs.com/wind90/p/4606018.html
Copyright © 2011-2022 走看看