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

[经验分享] mongodb新人扫盲

[复制链接]

尚未签到

发表于 2017-12-15 11:52:39 | 显示全部楼层 |阅读模式

  • 前言
  • 数据库基本命令
  • 集合(表)命令
  • 增加数据
  • 删除数据
  • 更新数据

    • 使用update()更新
    • 使用save()命令实现upsert
    • 自动更新信息

  • 查询数据
  • aggregate
  • $group
  • $sum
  • $limit
  • $match
  • $sort
  • $unwind
  • $project
  • $skip
  • mongoose的使用
前言


  • mongodb是什么?, 需fq
  • 如何安装mongodb?
数据库基本命令


  •   显示所有数据库: show dbs

  •   创建/使用数据库:use dbName

  •   创建数据库表,在mongoDB里又将表称为集合(collections), 因此创建表:db.createCollection("collectionName")

  •   显示数据库下的所有集合(表): show tables / show collections

  •   删除当前数据库: db.dropDatabase()

  •   查看当前所使用的数据库: db.getName()

  •   显示当前数据库的状态: db.stats()

  •   显示当前数据库的版本: db.version()

  •   注意: collection和table概念差不多,doc和row概念差不多。

集合(表)命令

增加数据


  •   创建一个集合: db.createCollection("tableName")

  •   添加文档:

  

db.tableName.insert({username: "john", age: "18"})  

  
// 或者
  
db.tableName.save({username: "john", age: "18"});
  

  
// 它们之间的区别
  

  
// 1. 使用save,如果对象不存在则插入,如果存在,则会调用update方法。如果是insert,或忽略调用update方法。
  

  
// 2. insert可以插入一个列表,而不用遍历,效率高。而save需要遍历,效率不如insert。
  

删除数据


  • 删除操作: db.tableName.remove({age: 18})
更新数据

使用update()更新
  

db.tableName.update({age: 18}, {$inc: {age:10}}, false ,true)  

  
// 等价于
  
update tableName set age = age + 10 where age = 18;
  

  
// 关于update
  
db.collection.update(
  <query>,
  <update>,
  {
  upsert: <boolean>,
  multi: <boolean>
  }
  
);
  

  
// {}里的是可选的
  
// upsert为true表示如果记录存在就更新,不存在就插入新的记录。
  
// multi为true表示更新所有匹配的文档,如果为false表示只更新第一个文档(默认行为)。
  

使用save()命令实现upsert
  

// 如果不指定'_id'值,save()命令会认为它是一个插入操作。  
// 如果指定,就是更新。
  

  
db.calendars.save({'uid': 'yuzf', 'projectId': 'test'}); // 插入一条数据
  
db.calendars.save({'_id': 'test', 'uid': 'yuzf', 'projectId': 'test'}); // 更新一条数据
  

自动更新信息
  

// 将name为yuzf的人的成绩加4,如果存在就更新,不存在就创建。  
db.stu.update({'name': 'yuzf'}, {$inc: {grade: 4}}, {upsert: true});
  

  
// 设置字段值
  
db.stu.update({'name': 'yuzf'}, {$set: {'grade': 200}});
  

  
// 删除指定字段
  
db.stu.update({'name': 'yuzf'}, {$unset: {'grade': 200}});
  

查询数据


  •   获取指定名称的集合: db.getCollection("tableName");

  •   获取集合里所有的数据:db.tableName.find().pretty();

  •   获取集合里的指定数据:db.users.find({'uid', 'yuzf'}).pretty();

  •   获取集合里的指定数据,然后指向看指定数据, 在第二个参数里添加键,并设置键的值为1即可:db.users.find({'uid': 'yuzf'}, {'uid': 1}).pretty();

  • 使用函数sort, limit, skip

    • 以uid进行排序: db.users.find().sort({ 'uid': 1 });
    • 限制查询结果返回的最大数目为10: db.users.find().limit(10);
    • 返回查询结果除了前20条的文档的其他文档: db.users.find().skip(20);

  • 使用固定集合、自然顺序和$natural

    • 固定集合必须使用createCollection(), 以显示的方式创建: db.createCollection("users", {capped: true,>
    • 因为固定集合的顺序和插入顺序是一样的, 如果想要逆转排序: db.users.find().sort({ $natural: -1 }).limit(10);

  •   获取单个文档: db.users.findOne();

  • 使用常用的聚合命令count, distinct, group

    • 统计users表里有多少个文档: db.users.count();
    • 去重: db.users.distinct('uid');, 将会返回一个数组,数组里包含的元素是去重了的uid。
    • 将结果分组:

  

  db.calendars.group({  key: {uid: true},
  initial: {total: 0},
  reduce: function(items, prev) {
  prev.total += 1;
  }
  });
  

  
// 以uid进行分组。
  
// 为每个已分组的结果提供一个基数。
  
// 正在遍历的当前文档和聚集计数对象(我认为就是那个基数)。
  

  
// 最后的结果格式数据是:
  
[
  {
  'uid': 'yuzf',
  'total': 1,
  },
  {
  'uid': 'test',
  'total': 3,
  }
  
]
  


  • 使用条件操作符

    • 执行大于和小于($lt,$gt,$lte,$gte)比较: db.users.find({ departmentNumber: {$lt: 100} });
    • 获取除uid为yuzf以外的其他文档: db.calendars.find({'uid': {$ne: 'yuzf'}}).pretty();
    • 指定一个匹配的数组($in): db.calendars.find({'uid': {$in: ['yuzf', 'yangh']}}).pretty();
    • 查找某个不在数组中的值: db.calendars.find({'uid': {$nin: ['yuzf', 'yangh']}}).pretty();
    • 匹配文档中的所有属性($all): db.calendars.find({'uid': {$all: ['yuzf', 'yangh']}}).pretty();
    • 在文档中搜索多个表达式: db.calendars.find({'uid': {$or: ['yuzf, 'yangh'']}}).pretty();
    • 使用slice来获取文档(分页): 不知道为什么,自己跑的时候报错,$slice unknown operator
    • 还有一些其他的,感觉不是很常用。

aggregate
  就我自己的理解,aggregate相当于Linux系统下的管道符,当前得到的结果可以作为下一次计算的输入。
  有很多管道操作符,这里只是介绍一部分常用的操作符。

$group
  关于group操作符, 它类似于关系数据库里的group by, 需要记住以下这几点:


  •   必须显示以_id作为分组。

  •   如果要以"什么"为分组,"什么"必须是对象。

  •   $表示该元素是对文档中字段的引用。

  看一个例子:
  

// 表结构是{device, isSmart,>
  
db.phones.aggregate({$group: {_id: "$device"}, total: {$sum: "$price"}});
  

  
// 得到的结果是:
  
{"id": "iPhone5S", "total": 10000}
  
{"id": "iPhone6S", "total": 10200}
  
{"id": "iPhone6P", "total": 13000}
  

$sum
  如果我们想要找到一个文档,计数就加一。那么我们可以使用$sum。就像上面的日子改写后就成了下面这样:
  

db.phones.aggregate({$group: {_id: "$device"}, count: {$sum: 1}});  

  
// 得到的结果是:
  
{"id": "iPhone5S", "count": 18}
  
{"id": "iPhone6S", "count": 2}
  
{"id": "iPhone6P", "count": 10}
  

$limit
  如果我们想要限制得到的数据只有10条,那么就会用到了$limit, 我认为它和查询时的limit()没有什么区别。
  

db.phones.aggregate({$group: {_id: "$device", count: {$sum: 1}}}, {$limit: 10});  

$match
  我猜想这个管道符应该用得特别多,通过它可在聚集管道中高效地返回一个普通地MongoDB查询的结果。
  $match操作符,最好位于管道的开始, 因为这样会大大减少开销。
  

db.phones.aggregate({$match: {"device": "iPhone9S"}});  

$sort
  它和普通查询里的sort没有什么不同。

$unwind
  这应该也是一个特别常用的管道符, 它接受一个数组并将每个元素分割到一个新的文档中(在内存中而不是添加到集合中)。

$project
  如果我们查询出来我们想要的数据,但是只是想要一部分的字段,该如何呢?那么就会用到$project这个管道符了。
  

// 只会显示_id和device这两个字段  
db.phones.aggregate({$project: {_id: 1, device: 1}});
  

$skip
  同样,它和普通查询里的skip没有什么不同。如果我们想要得到3000条数据里的第1500~1510条数据该怎么写呢?
  

db.phones.aggregate({$skip: 1500, $limit: 10});  

mongoose的使用
  未完待续...
  参考:
  mongoDB基本使用
  
mongodb大数据处理权威指南

运维网声明 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.iyunv.com/thread-424337-1-1.html 上篇帖子: MongoDB 用户权限管理 下篇帖子: MongoDB分片原理篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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