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. php5.3.x连接MS SQL server2008

    开篇 因为毕设老师需求的原因,虚拟旅游网站要求的数据库必须使用MS SQL server. 我最擅长的web编程语言是PHP,但是在PHP中链接MS SQL server是一件非常麻烦的事,我个人分析 ...

  2. python网络编程及高并发问题

    面试其他篇 目录: 1.1

  3. stm32最简单的实现BootLoader

    BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序. 在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序.也就是IAP升级.在了解完基本的实现原理后 ...

  4. 动态规划之115 Distinct Subsequences

    题目链接:https://leetcode-cn.com/problems/distinct-subsequences/description/ 参考链接:https://www.cnblogs.co ...

  5. 【Python026--字典内键方法】

    一,内键方法 1.fromkeys(...) 语法:dict1.fromkeys(s[,v]):s指的是字典的键值,[,v]指的是可选项(值),[,v]不填写的话默认为none #不填写第二个值,默认 ...

  6. "msg": "Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this. Please add this host's fingerprint to your known_hosts file to ma

    Centos7.5 ansible第一次使用模块报错 问题: [root@m01 ~]# ansible webservers -m ping -i ./hosts 172.16.1.7 | FAIL ...

  7. QWidget设置背景图

    1.使用QSS出现很多问题 2.方法 this->setAutoFillBackground(true); QPalette palette = this->palette(); pale ...

  8. 安装旧版本的Firefox

    在Ubuntu上安装就版本的Firefox,此处以version 46为例子: 1.删除已存在的Firefox, On CentOS/RHEL # yum remove firefox On Ubun ...

  9. Array数组集合的排序

    /* ######### ############ ############# ## ########### ### ###### ##### ### ####### #### ### ####### ...

  10. 深入了解JVW

    Java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时 ...