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 分享(一)的更多相关文章

  1. mongodb分享(二)

    上次讲的:查询find\findone\pretty.条件操作符 (大于.小于.大于等于.小于等于.不等于,$type).limit\skip.sort.Db.postjson.getIndexes( ...

  2. MongoDB,HDFS, Spark to 电影推荐

    http://www.infoq.com/cn/news/2014/12/mongdb-spark-movie-recommend MovieWeb是一个电影相关的网站,它提供的功能包括搜索电影信息. ...

  3. MongoDB基础教程系列--第一篇 进入MongoDB世界

    1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...

  4. MongoDB入门学习(1)

    什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供 ...

  5. MySQL与MongoDB的区别

    一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨 ...

  6. MongoDB简介、特点、原理、使用场景、应用案例

    简介 MongoDB[1] 是一个基于分布式文件存储的数据库.由C 语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB[2] 是一个介于关系数据库和非关系数据库之间的产品, ...

  7. mongodb什么时候使用

    转自:https://blog.csdn.net/justlpf/article/details/80392944 简介 MongoDB[1] 是一个基于分布式文件存储的数据库.由C 语言编写.旨在为 ...

  8. 01 . MongoDB简介及部署配置

    简介 什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用 ...

  9. 别老扯什么Hadoop了,你的数据根本不够大

    本文原名“Don't use Hadoop when your data isn't that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞过 ...

随机推荐

  1. 复选框批量删除操作-jquery方式

    1.首先在页面添加一个批量删除的按钮:<li class="btns"><input id="deleteSubmit" class=&quo ...

  2. 20165211 2017-2018-2 《Java程序设计》课程总结

    20165211 2017-2018-2 <Java程序设计>课程总结 一.每周作业及实验报告博客链接汇总 预备作业1:我期望的师生关系 预备作业2:学习基础和C语言调查 预备作业3:Li ...

  3. https://blog.csdn.net/dayancn/article/details/54692111

    Ubuntu恢复被删除的文件 昨天一不小心,执行了rm xx  -rf,把一个项目删除了.然后就是各种悔恨,各种自责,这个项目可是一周的工作量啊.最后肯定得解决,于是google搜索发现了恢复神器ex ...

  4. topcoder srm 480 div1

    problem1 link 直接模拟即可. problem2 link 首先,网关一定是安装在client与server之间的链路上.而不会安装在client与client之间的链路上.对于一条路径c ...

  5. java后端学习路线

    java基础-->java设计模式-->java数据结构与算法

  6. mysql的 深度使用 - 游标 , 定时器, 触发器 的使用 ?

    游标 叶叫做 光标; 只能使用在 mysql的 存储过程 或函数中! 游标的概念? 为什么要使用 游标? 什么叫 定时器, 就是事件 event! 是在 mysql 5.0以上的版本中, 才能使用支持 ...

  7. 再谈 linux 的sed用法

    很多东西, 如果太复杂, 太庞杂, 一开始, 可以只掌握最简单的. 如果连最简单的都不能掌握, 那看那么多有什么用? 关于cut, sed的 处理过程和思想? vm: virtual machine, ...

  8. yum命令showduplicates安装指定版本包

    默认情况下,我们用yum list 或者 yum install 的时候,yum会默认选择最新的版本. 如果我们需要安装指定版本的某个软件包,以使之能够和我们现有环境的软件包版本匹配,那么就需要用到s ...

  9. SpringBoot Mybatis 分页插件PageHelper

    添加maven配置: <!-- 分布插件 --> <dependency> <groupId>com.github.pagehelper</groupId&g ...

  10. Netty实践与NIO原理

    一.阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件操作都是阻塞的,以套接字接口为例,在进程空间中调用recvfrom,系统调用直到数据包到达且被复制到应用进程缓冲区 ...