前言

  1. mongodb是什么?, 需fq
  2. 如何安装mongodb?

数据库基本命令

  1. 显示所有数据库: show dbs

  2. 创建/使用数据库:use dbName

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

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

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

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

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

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

  9. 注意: collectiontable概念差不多,docrow概念差不多。

集合(表)命令

增加数据

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

  2. 添加文档:

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

// 或者
db.tableName.save({username: "john", age: "18"}); // 它们之间的区别 // 1. 使用save,如果对象不存在则插入,如果存在,则会调用update方法。如果是insert,或忽略调用update方法。 // 2. insert可以插入一个列表,而不用遍历,效率高。而save需要遍历,效率不如insert。

删除数据

  1. 删除操作: 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}});

查询数据

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

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

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

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

  5. 使用函数sort, limit, skip

    • 以uid进行排序: db.users.find().sort({ 'uid': 1 });
    • 限制查询结果返回的最大数目为10: db.users.find().limit(10);
    • 返回查询结果除了前20条的文档的其他文档: db.users.find().skip(20);
  6. 使用固定集合、自然顺序和$natural

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

  8. 使用常用的聚合命令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,
}
]
  1. 使用条件操作符

    • 执行大于和小于($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, 需要记住以下这几点:

  1. 必须显示以_id作为分组。

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

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

看一个例子:

// 表结构是{device, isSmart, releaseTime, price}

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大数据处理权威指南

mongodb新人扫盲的更多相关文章

  1. mongodb新手扫盲

    前言 数据库基本命令 集合(表)命令 增加数据 删除数据 更新数据 查询数据 mongoose的使用 前言 mongodb是什么?, 需fq 如何安装mongodb? 数据库基本命令 显示所有数据库: ...

  2. MongoDB 快速扫盲贴

    长话短说 经过996的历练,开发者潜意识里总是以object的视角看待事物, 现在某些数据库也具备这样的视角. MongoDB是一个文档型(类JSON 文档)数据库,相比传统的关系型row/colum ...

  3. NodeJS+Express+MongoDB 简单实现数据录入及回显展示【适合新人刚接触学习】

    近期在看NodeJS相关 不得不说NodeJS+Express 进行网站开发是很不错,对于喜欢玩JS的来说真是很好的一种Web开发组合 在接触NodeJS时受平时Java或者C#中API接口等开发的思 ...

  4. 搭建一个Mongodb (Windows) 版本

    因为有项目需要借助nosql 做一个中间层,所以选择了Mongodb 来搞,其实之前呢已经搭建过这部分的环境,这次再次搭建也是记录一下,当时给自己的一个扫盲123教程 借助Mongodb 其实也是缓存 ...

  5. IT新人论成长

    说自己是新人,其实自己也不新了,2012年毕业,辗转3个城市,现在在上海一家公司,工资不到5K. 在来现在公司之前,我从事web后台开发,采用MVC模式,虽然做了不少的网站,但感觉自己的水平还是在底层 ...

  6. 为什么选择MongoDB?

    为什么选择MongoDB? 阅读目录 开始 为啥用MongoDB? 原来的架构 新需求 如何解决? 新思路 选型条件 一些候选者 最初的选择 代价 新的候选者 重新选择 胆子大一点 胆子再大一点 胆子 ...

  7. 我的Emacs折腾经验谈(一) 一些给新人的建议

    这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西,首先说我曾经算是个极 ...

  8. 关于MongoDB安全事件的一些思考

    刚刚过去的这个周末,各位大数据和数据库从业者想必是被MongoDB的"安全事件"给刷屏了,MongoDB作为当前NoSQL在全球的领军人物,遭到这么大规模的黑客攻击,这也再次让我们 ...

  9. 【巨杉答疑】巨杉数据库和mongodb有什么关系吗?

    哈罗,艾瑞巴蒂~巨杉答疑栏目今日上线啦! 巨杉数据库作为商业化开源软件,已经拥有大量社区用户.开源至今,大到分布式数据库原理.架构问题,小到SDB巨杉数据库的安装使用问题,大家似乎都有很多问题想要和我 ...

随机推荐

  1. 【Flex】读取本地JSON,然后JSON数据转成XML数据

    package utils { import flash.xml.XMLDocument; import flash.xml.XMLNode; import mx.rpc.xml.SimpleXMLE ...

  2. 【Egret】里使用video标签

    egret里使用Html5的Video标签 egret里使用Html5的Video标签的demo: 链接:http://pan.baidu.com/s/1nuNyqRR 密码:x58i //----- ...

  3. 性能调优之访问日志IO性能优化

    性能调优之访问日志IO性能优化   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821 ...

  4. 老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 4

    这一部分的代码逻辑关系是这样的: 344行: 一个外部循环每次从上次保存下来的设备列表获得一个设备Device实例 350行: 再在一个内部循环从最新的设备列表中获得一个设备Device实例 353行 ...

  5. Hexo + Github Pages 搭建个人博客

    之前一直想搭建自己的博客,由于自己的懒惰拖到现在.好了,废话不多说!直接上干货! 安装Node.js 安装Git Github Pages配置 安装Hexo及主题设置 进阶篇-高级定制 其它实用功能 ...

  6. MongoDB--在windows下的安装过程及基本配置

    这几天在做一个简单的后台博客系统,数据库用到了 MongoDB ,虽说官方的文档比较全,但是对于我一个英语一般的人来说,或多或少在配置的时候出现了一些问题,总结了一下在安装及创建服务的过程 Mongo ...

  7. 如何使用第三方webservice

    webservice地址后加wdls 生成后把文件名改为wdsl 调用方式: 1.添加webservice引用: 2.生成代理类的方法(本人比较喜欢用这种方式): 使用cmd命令行: a.通过webs ...

  8. Java设计模式:工厂模式

    问题提出 Java的工厂模式与现实生活中的工厂的模型是很相似的.工厂是用来做什么?当然是用来生成产品.因此在Java的工厂模式的关键点就是如何描述好产品和工厂这2个角色之间的关系. 下面来仔细描述一下 ...

  9. Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)

    ♣下载安装tomcat7 ♣设置启动和关闭 ♣设置用户名和密码 ♣发布java web项目 声明:这篇教程是建立在前两篇教程的基础上的,所以,还没安装工具和jdk,可以先看这个系列的前面两篇(去到文末 ...

  10. Java Comparator的范型类型推导问题

    问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List<Pair<LocalDate, L ...