Mongodb 分享(一)
Mongodb使用基础知识:
一、简介
1.mongodb是什么?
1)MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
2)MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。它是文档型NosQL数据库
3)组成:文档(document)——》集合(clooecton)——》数据库(database)
2. 什么是NoSQL?
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
3.为什么使用NoSQL ?
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
参考链接:https://blog.csdn.net/hsd2012/article/details/51279472
另外:
“_id”:每一个文档都有一个特殊的键“_id”,在所属集合中唯 一。
自带JavaScript shell,用于管理MongoDB的实例或数据操作。
文档:“键:值”
键:字符串(键不能含 \0空字符 $)
值:多种不同数据类型,(整数、字符串、文档、)
区分:区分类型,区分大小写。
注:文档不能有重复的键。文档中的键值对是有序的。
集合:一组文档,可以看作是一个拥有动态模式(dynamic schema)的表。
动态模式:一个集合中的文档可以是各种各样的。
{“greeting”:”Hello, world”}
{“foo”:5}
值类型不同,且键也完全不同的两个文档,可以放在同一个集合中。
问:还有必要使用多个集合吗?
查询速度、数据更集中、创建索引。
所以,一个集合中只放入一种类型的文档。尽管mongodb没有强制要求。
命名:不能包含 (“”、\0、system开头、$、)
数据库:多个集合组成数据库
命名:不能是空字符串(“”)
不得含有 /\.”*<>:|?$(基本上只能使用ASCII中的字母和数字)
库名区分大小写
库名最多为64字节。
保留库名(admin local config)
3)mongodb 客户端:NoSQL Manager for MongoDB 使用实操
(1)mongodb查询:find pretty findOne
见“电子书”and or >gt >=gte <lt <=lte != ne limit skip sort count
注: skip和limit, 当两者一起使用的时候, 不管其位置顺序,默认先skip,再limit。
(2)) 获取当前表的索引
Db.postjson.getIndexes();
加索引的代价:每次写操作时会耗费多的时间,占用更多的磁盘空间
通常一个特定集合,不建议有两个以上的索引。
(3) 查询指定字段 https://www.cnblogs.com/wuxiang/p/5553658.html
二、案例介绍:华住价格推送项目
1)项目简介
2)python + mysql + mongodb
3)纠结过的点
1. 五个脚本同时写一个EXCEL表的不同sheet页,会有问题吗?
2. 定时任务运行,自动生成EXCEL
3. 汇总信息的生成为什么要和明细信息一起,另起一个脚本读EXCEL汇总不好吗?
4. 如果我的脚本执行过程当中,报数据库连不上的错误了,咋办?
5. mongodb存的带时区的时间为啥与我们的时间有8小时的时差。
6.从mongodb中取数据时发何利用索引,正确的思路是什么?121万条数据。
7.写伪代码的重要性,日志的重要性。
8.与数据库的交互越少越好,一次性取出来,python脚本来处理,性能好些。
9.python查询mongodb语句参数化的问题。Json对象等同于python代码,直接参数化即可。里面不是字符串是个json对象。
10 这种like '% %' 这里面的关键字的占位符这样写对不对?
%%%s%%% 见图片
11 不足的:关于抽象。关于异常。排错时,分解分解再分解,面向对象,找对象。
12. 多行注释报语法错误:原因:多行注释也要注意缩进,python对缩进要求严格。注释符的缩进Ok了,就不报错了。
13. 特别想知道mysql\mongodb\kafka\redis的区别和使用场景 。
上次讲的:查询、条件操作符 (大于、小于、大于等于、小于等于、不等于,$type)
$type:$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
BSON类型:
https://blog.csdn.net/leshami/article/details/52668870
https://www.runoob.com/mongodb/mongodb-operators-type.html
聚合:aggregate 管道聚合:pipeline aggregate
1. group by
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}}]);
这里的$sum:1 相当于count(*) 要对某个字段进行sum 应写成 $sum : “$字段名”
2. group by + where
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}},{$match:{bwHotelID:284500}}]);
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}},{$match:{_id:160733}}]);
db.postjson.aggregate([{$match:{bwHotelID:160733}}]);
这里的$match就相当于sql语法中的where
3. group by + 字段筛选
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}},{$project:{_id:0,reviewcnt:1}}]);
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}},{$project:{_id:0,reviewcnt:1}},{$match:{reviewcnt:4}}]);
db.postjson.aggregate([{$group:{_id:"$bwHotelID",reviewcnt:{$sum:1}}},{$project:{_id:0,reviewcnt:1}},{$match:{reviewcnt:{$ne:4}}}]);
条件操作符在match中仍然可以用。 $gt $lt $gte $lte $ne
4. group by + where + 字段筛选 + having
4. sum
5. avge
6. min
7. max
8. push 在结果文档中插入值至一个数组
9. addToSet
10. first
11. last
管道聚合: 语法:db.collection.aggregate(pipeline, options)
1) project 字段筛选
2) match where
3) limit limit
4) skip skip
5) unwind
6) group group by $group语法: { $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }
7) sort order by
8) geoNear
https://blog.csdn.net/congcong68/article/details/51619882
https://blog.csdn.net/congcong68/article/details/51620040
注:group: 如果_id为null 相当于select count(*) from table
Mongodb 分享(一)的更多相关文章
- mongodb分享(二)
上次讲的:查询find\findone\pretty.条件操作符 (大于.小于.大于等于.小于等于.不等于,$type).limit\skip.sort.Db.postjson.getIndexes( ...
- MongoDB,HDFS, Spark to 电影推荐
http://www.infoq.com/cn/news/2014/12/mongdb-spark-movie-recommend MovieWeb是一个电影相关的网站,它提供的功能包括搜索电影信息. ...
- MongoDB基础教程系列--第一篇 进入MongoDB世界
1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...
- MongoDB入门学习(1)
什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...
- MySQL与MongoDB的区别
一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨 ...
- MongoDB简介、特点、原理、使用场景、应用案例
简介 MongoDB[1] 是一个基于分布式文件存储的数据库.由C 语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB[2] 是一个介于关系数据库和非关系数据库之间的产品, ...
- mongodb什么时候使用
转自:https://blog.csdn.net/justlpf/article/details/80392944 简介 MongoDB[1] 是一个基于分布式文件存储的数据库.由C 语言编写.旨在为 ...
- 01 . MongoDB简介及部署配置
简介 什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用 ...
- 别老扯什么Hadoop了,你的数据根本不够大
本文原名“Don't use Hadoop when your data isn't that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞过 ...
随机推荐
- Linux下Keepalived安装与配置
一.简介 负载平衡是一种在真实服务器集群中分配IP流量的方法,可提供一个或多个高度可用的虚拟服务.在设计负载均衡拓扑时,重要的是要考虑负载均衡器本身的可用性以及它背后的真实服务器.用C编写的类似于la ...
- Java类型信息
一.引言 最近在阅读<Java编程思想>,学习一下java类型信息,现在做一下总结.Java如何让我们在运行时识别对象和类的信息的.主要有两种方式:一种是传统的“RTTI”,它假定我们在编 ...
- JavaScript中冒泡与事件委托
冒泡 事件触发后事件流的三个阶段按顺序依次是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 大盒子包裹小盒子,两个盒子都分别添加点击事件,当点击小盒子,两个盒子的事件都会触发. 事件委托 下级元素委托上 ...
- Java中单例设计模式,饿汉式和懒汉式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...
- DataSnap服务器从xe2升级到xe5报错的处理
DataSnap服务器从xe2升级到xe5环境下,能够正常编译,但运行后会报错,如下图: 处理参考: http://blogs.embarcadero.com/pawelglowacki/2013/0 ...
- Python3基础 list list()生成空列表
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- RPMB分区介绍【转】
本文转载自:https://blog.csdn.net/xiezhi123456/article/details/81479793 RPMB(Replay Protected Memory Block ...
- YII框架的使用
YII框架的使用 spit: 吐痰,吐口水, 过去式: spat spat: 本身也可以作为一个单词, 意思是: "小打小闹""小的吵闹""小争吵&q ...
- 【注册码】Matlab7.0(R14)注册码
Matlab 7 (R14) 注册码1:14-13299-56369-16360-32789-51027-35530-39910-50517-56079-43171-43696-14148-64597 ...
- LOJ#2427. 「POI2010」珍珠项链 Beads
题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...