mongoDB操作详细
简介
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦
数据结构
MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"
软件安装
本博客基于MongoDB 3.4进行演示,小伙伴们自行去下载一个,点击下一步下一步安装完成后,加入MongoDB的bin文件中,复制文件路径并添加到环境变量中,这个时候打开cmd输入mongod进行测试
那我们就在C:下面创建一个data文件夹,里面再创建一个db文件夹
再启动服务发现OJBK了
我们再开启一个cmd窗口去链接我们开启的mongod服务,发现能够正确连上了。这里需要记住的小小知识点有,常用数据库软件的默认端口号
MySQL:3306
Redis:6379
MongoDB:27017
提醒一下,在操作mongoDB数据库的时候,你可千万别把刚刚启动的mogond窗口关了哈,那就相当于是数据库服务器,你叉了就GG了,恭喜再来一次了就!
MongoDB中的增删改查
在开始之前需要介绍一下MongoDB独有的特点:使用不存在的对象即创建该对象到内存,如果对创建的对象进行了增加数据操作,那么就会在数据库中真真实实,明明白白的自动帮我们创建出来(这一特性对数据的操作依然有效,即操作数据没有的字段,那么就会给该数据新增这一字段)
增
插入数据的方式有插入单挑和插入多条两种(insertOne insertMany)
insertOne: 插入一条数据,官方推荐
insertMany:插入多条数据,无需参数控制,官方推荐,多条数据用[]包裹,这个更普遍的叫法是array,而不是我们python里面的列表,将列表别人可能不懂,但是你讲array那肯定能懂
查
介绍完增删改查你就会发现,只有查有点特殊,
查询多条find后面不跟Many
查询单条findOne
改
修改一条updateOne({})
这里就展示了开头我们说的mongodb的特殊性,使用不存在的对象就自动给你创建,至于上面出现的$set后面再介绍
修改多条数据updateMany({})
删
remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
MongoDB数据结构
Object ID :Documents 自生成的 _id
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (需要注意的是mongoDB中出现的数字默认都是Double类型而不是整型)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
看着挺多的,但是真要是用的话,没那么复杂,很简单的哦
1.Object ID:
"_id" : ObjectId("5b151f8536409809ab2e6b26") #"5b151f85" 代指的是时间戳,这条数据的产生时间
#"" 代指某台机器的机器码,存储这条数据时的机器编号
#"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
#"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
#以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息 #注意:这个类型是不可以被JSON序列化的
这是MongoDB生成的类似关系型DB表主键的唯一key,注意中说了,这个ID不能被序列化,那么我们该如何传输呢?一会介绍pymongo的时候会给出答案!
2.Date:
"_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),
"name" : "Hello",
"date" : ISODate("2018-06-05T15:28:33.705+08:00")
一般不用,而是用ISODate.valueof()直接是时间戳格式,到哪都好使
MondoDB中的$相关
一.查询中常见的 等于 大于 小于 大于等于 小于等于
等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "啊哈哈"
大于 : 在MongoDB中的 大于 > 号 我们用 : $gt 比如 : "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据
小于 : 在MongoDB中的 小于 < 号 我们用 : $lt 比如 : "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据
大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte 比如 : "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据
小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte 比如 : "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据
这就是MongoDB中的运算符,是不是很类似我们使用的ORM中的运算符啊,没错,最开始的时候我们就已经说了,MongoDB的操作就是很类似ORM的
二.MongoDB中的那些个update修改器: $inc $set $unset $push $pull
1.$inc : Python中的 变量 += 1 , 将查询到的结果 加上某一个值 然后保存
{$inc:{"score":1}}的意思是,"score"的原有数值上面 +1,$inc 的用法是不是很简单啊,就是原有基础上在增加多少对吧
2.$set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)了
再把 "score" 为 20 分的 "score" 赋值为 59 分
3.$unset : 用来删除Key(field)的
做一个小例子 : 刚才我们有一个新的"english_name" 这个field ,现在我们来删除它
成功了! {$unset:{"english_name" : 1}} 就是删除 "english_name" 这个 field 相当于 关系型数据库中删除了 字段
4. $push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法
首先我们要先对原有数据增加一个Array类型的field:
使用update $set 的方法只能为Document中的第一条添加
使用updateMany $set 的方法 可以为所有满足条件的 Document 添加 "test_list" , 注意我这里的条件为空 " {} " 就算是为空,也要写上"{}" 记住记住记住
接下来我们就要队列表进行添加了: 将 "score" 为 100 的Document 中"test_list" 添加一个 6
$push 是在 Array(list) 的尾端加入一个新的元素 {$push : {"test_list" : 6}}
5.$pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
把我们刚才$push进去的 6 删除掉
如果 Array 数据类型中 如果有 多个 6 怎么办呢?
全部删掉了.....
得出了一个结论,只要满足条件,就会将Array中所有满足条件的数据全部清除掉
6. $pop : 指定删除Array中的第一个 或 最后一个 元素
做个小例子: 删除"score" 等于 100 分 test_list 的最后一个元素
怎么删除第一个呢?
{$pop:{"test_list" : -1}} -1 代表最前面, 1 代表最后边 (这和我们大Python正好相反) 记住哦
MongoDB中的$奇妙用法
在MongoDB中有一个非常神奇的符号 "$"
"$" 在 update 中 加上关键字 就 变成了 修改器
其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符
针对object操作
前面的price.price表示的是price这个字段下的所有含有price键的数据值,后面的price.$指的就是找到的array下表对应的y一行数据{},再.字段拿到键对应的值
MongoDB中的限制查询条数
1. Limit 选取 : 我要从这些 Document 中取出多少个
做个小例子 : 我只要 2 条 Document
2.Skip 跳过 : 我要跳过多少个Document
做个小例子 : 我要跳过前两个 Document 直接从第三个Document 开始
3.Limit + Skip : 从这儿到那儿 的 选取
就是刚才的问题,一个小例子 : 我只想要第二条和第三条怎么处理呢
4. Sort 排序 : 将结果按照关键字排序
做个小例子 : 将find出来的Document 按照 price 进行 升序 | 降序 排列
国际惯例 : 按照 price 字段进行升序 , 1 为升序 , -1 为降序
5. Limit + Skip + Sort 混搭来一把
一个例子 : 选取第二条第三条 并 按照 price 进行 升序排列
问题出现了, 按道理不应该是 9800 然后 19800 吗?
知识点来喽
重点 : Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort 其次 Skip 最后 Limt
Skip + Limit 的优先级 也是先 Skip 再 Limit
看一次,记不住
看两次,不会用
看三次,不如自己做一次
做一次,不如做三次
练习一下加深印象
mongoDB操作详细的更多相关文章
- sqlite数据库操作详细介绍 增删改查,游标
sqlite数据库操作详细介绍 增删改查,游标 本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code package com.example ...
- thinkPHP 空模块和空操作、前置操作和后置操作 详细介绍(十四)
原文:thinkPHP 空模块和空操作.前置操作和后置操作 详细介绍(十四) 本章节:介绍 TP 空模块和空操作.前置操作和后置操作 详细介绍 一.空模块和空操作 1.空操作 function _em ...
- 基础拾遗-----mongoDB操作
基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...
- mongodb操作文件
mongodb操作文件,主要是通过GridFS类.存储文件主要存放在fs中,其中的fs是数据库默认的.并且GridFS是直接与数据库打交道,与collection集合无关. ============= ...
- 【配置】MongoDB配置文件详细配置
# 数据文件位置 dbpath = /opt/module/mongoData # 日志文件位置 logpath = /opt/module/mongoLog/mongodb.log # 以追加方式写 ...
- Centos7 安装MongoDB的详细过程
一.简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品 ...
- MongoDB聚合查询及Python连接MongoDB操作
今日内容概要 聚合查询 Python操作MongoDB 第三方可视化视图工具 今日内容详细 聚合查询 Python操作MongoDB 数据准备 from pymongo import MongoCli ...
- MongoDB操作
创建.删除数据库 格式 use DATABASE_NAME 如果不存在,则创建,否则直接切换到该数据库 显示当前所在的数据库 db 显示所有数据库 show dbs 删除数据库 db.dropData ...
- PHP mongoDB 操作
<?php /** * PHP操作MongoDB学习笔记 */ //************************* //** 连接MongoDB数据库 **// //************ ...
随机推荐
- 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记(1)- 环境搭建(Python2.7.14 + PyAudio0.2.11 + Matplotlib2.2.3 + SpeechRecognition3.8.1 + pyttsx3 2.7)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具Jays-PySPEECH诞生之环境搭建. 在写Jays-PySPEECH时需要先搭好开发环境,下表列出了开发过程中会用到的 ...
- 利用BGP虚拟下一跳实现链路负载均衡
最近针对BGP链路负载均衡方案“虚拟下一跳”进行了总结,现将总结的PPT贴上来.
- 为什么我的gridview.DataKeys.count总是为零?并提示索引超出范围
第一个原因 你没有设置DataKeyNames属性, 第二个原因 你的DataSource是NUll值 第二个原因 DataKeyNames字段区分大小写
- C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...
- js中函数表达式和自执行函数表达式的用法总结
立即调用函数表达式 给函数体加大括号,在有变量声明的情形下,没有任何区别 但是,如果只是[自动执行]的情形下,就会不同 因为,一个匿名函数,不赋值或函数体不加小括号,是不能自动执行的 //以下情形并无 ...
- 【代码笔记】Web-CSS-CSS Display
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- vue 常用语法糖
//来自 https://www.cnblogs.com/lhl66/p/8021730.html 侵删 el:element 需要获取的元素,一定是HTML中的根容器元素 data:用于数据的存储 ...
- HTML和CSS前端教程05-CSS盒模型
目录 1. CSS盒模型 1.1 元素的尺寸 1.2. 元素内边距 padding 1.3. 元素外边距 margin 1.4. 处理溢出overflow 1.5. 元素的可见性Visibility ...
- AS使用自带虚拟机报错解决
Android studio自带的Google虚拟机越来越好用了,所以可以打开这个功能,想用的时候打开使用即可 使用的过程中经常会遇到这样的问题: 19:26 Emulator: emulator: ...
- Servlet工作原理解析 《深入分析java web 技术内幕》第九章
参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...