设为首页 收藏本站
查看: 1128|回复: 0

[经验分享] MongoDB相关方法

[复制链接]

尚未签到

发表于 2018-10-24 10:52:04 | 显示全部楼层 |阅读模式
一、MongoDB 排序
MongoDB sort() 方法
  在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。
语法
  sort()方法基本语法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})实例
  col 集合中的数据如下:
  { "_id" : ObjectId("5b554b9e7dc80c93e5d47b3a"), "title" : "study1", "description" : "mongodb study", "by" : "cara1", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 200 }
  { "_id" : ObjectId("5b554bc37dc80c93e5d47b3b"), "title" : "study2", "description" : "mongodb study", "by" : "cara2", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 150 }
  { "_id" : ObjectId("5b554bd47dc80c93e5d47b3c"), "title" : "study3", "description" : "mongodb study", "by" : "cara3", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
  以下实例演示了 col 集合中的数据按字段 likes 的降序排列:
  > db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
  { "title" : "study1" }
  { "title" : "study2" }
  { "title" : "study3" }
二、MongoDB 索引
  索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
  这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
  索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
createIndex() 方法
  MongoDB使用 createIndex() 方法来创建索引。
  注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
语法
  createIndex()方法基本语法格式如下所示:
>db.collection.createIndex(keys, options)  语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。
实例
  > db.col.createIndex({"title":1})
  createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。
>db.col.createIndex({"title":1,"description":-1})>  createIndex() 接收可选参数,可选参数列表如下:
ParameterTypeDescriptionbackgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background"   可选参数。  "background" 默认值为false。uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。dropDupsBoolean在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.实例
  在后台创建索引:
db.values.createIndex({open: 1, close: 1}, {background: true})  通过在创建索引时加 background:true 的选项,让创建工作在后台执行
三、MongoDB 聚合
  MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
aggregate() 方法
  MongoDB中聚合的方法使用aggregate()。
语法
  aggregate() 方法的基本语法格式如下所示:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)实例
  集合中的数据如下:
  > db.col.find().pretty()
  {
  "_id" : ObjectId("5b554b9e7dc80c93e5d47b3a"),
  "title" : "study1",
  "description" : "mongodb study",
  "by" : "cara1",
  "url" : "http://cara.com",
  "tags" : [
  "mongodb",
  "database",
  "NoSQL"
  ],
  "likes" : 200
  }
  {
  "_id" : ObjectId("5b554bc37dc80c93e5d47b3b"),
  "title" : "study2",
  "description" : "mongodb study",
  "by" : "cara2",
  "url" : "http://cara.com",
  "tags" : [
  "mongodb",
  "database",
  "NoSQL"
  ],
  "likes" : 150
  }
  {
  "_id" : ObjectId("5b554bd47dc80c93e5d47b3c"),
  "title" : "study3",
  "description" : "mongodb study",
  "by" : "cara3",
  "url" : "http://cara.com",
  "tags" : [
  "mongodb",
  "database",
  "NoSQL"
  ],
  "likes" : 100
  }
  >
  现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
  > db.col.aggregate([{$group : {_id : "$by", num_tutorial : {$sum : 1}}}])
  { "_id" : "cara3", "num_tutorial" : 1 }
  { "_id" : "cara2", "num_tutorial" : 1 }
  { "_id" : "cara1", "num_tutorial" : 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.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])$addToSet在结果文档中插入值到一个数组中,但不创建副本。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625839-1-1.html 上篇帖子: MongoDB(4.0)分片——大数据的处理之道 下篇帖子: 大数据 MongoDB 3.2.1 分片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表