本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介、2.MongoDB和关系数据库对比、3.MongoDB基本概念、4.mongo shell的使用以及对MongoDB的增删改查操作

Ⅰ、MongoDB简介

  MongoDB是一款基于分布式文件存储的数据库,是一种文档型数据库,是介于关系型和非关系型数据库之间的产品,是最接近关系型数据库的数据库。MongoDB中的每一条记录就是一个文档,是一个数据结构,由字段和值对组成,字段的值可能其他文档,数组,以及文档数组。一般用作离线数据分析使用,放在内网居多,提供高性能的数据持久化。

II、MongoDB和关系数据库对比

Ⅲ、MongoDB基本概念

    • 集合(collection)就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表。
    • 文档(document)是MongoDB中数据的基本单元,非常类似于关系型数据库系统中的行(但是比行要复杂的多)。
    • MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限。
    • MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据作用非常大。
    • 每一个文档都有一个特殊的键”_id”,它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键。

Ⅳ、mongo shell的使用以及对MongoDB的增删改查操作

⑴ mongo shell的使用

  安装好MongoDB后我们开始mongo Shell:在数据库运行的情况下进入我们MongoDB的安装目录下的mongo.exe可以直接打开mongo Shell,

    db :显示当前正在使用的数据库

    use  <db> :进行当前使用的数据库切换

    show  dbs :显示当前所有可用的数据库

    要在不切换当前数据库访问其他的数据库使用 db.getSiblingDB() 方法。

    当切换到一个不存在的数据库在第一次插入数据时会进行数据库的创建操作

    如果mongo Shell不接受我们输入的集合名称可以使用代替语法来代替:比如我们名称中包含空格或连字符”-”,或者以数字开始:若我们想要对集合名称为3test的集合进行操作则输入以下替代语法:

      db[“3test”].find() 或者 db.getCollection(“3test”).find()

⑵  MongoDB数据库文档的增删改查操作

  ① 插入文档:

  文档的数据结构和json基本一样,所存储在集合中的数据都是BSON格式(即JSON的一种二进制的存储格式,又称Binary JSON)插入文档使用如下函数:

  collection表示集合的名称,插入时若此名称集合不存在则会自动创建此集合。若在插入操作中未指定_id字段,MongoDB会自动添加_id字段。

  ②  查询文档:

  查询文档使用find方法:

    db.collection.find( <query filter>, <projection> ):其中参数<query filter>是过滤条件,指明返回哪些文档,<projection> 指明返回文档的哪些字段,限制了返回数据量。

  <query filter>参数的两种方式<field>:<value>形式和使用查询操作符<field1>: { <operator1>: <value1> }的形式

    • db.users.find( { status: "A" } )   ==>   users集合中检索status字段值为A的所有文档
    • db.users.find( { status: { $in: [ "P", "D" ] } } )  ==>  从users集合中检索字段为”p”和”D”的所有文档

的所有文档

    db.users.find( { status: "A", age: { $lt: 30 } } )

的所有文档

    db.users.find({

      $or: [ { status: "A" }, { age: { $lt: 30 } } ]

    })

要么type等于1的所有文档

    db.users.find({

      status: "A",

      $or: [ { age: { $lt: 30 } }, { type: 1 } ]

    })

  嵌入文档查询:

    嵌入文档上的精确匹配:从users集合中查找出所有favorities字段只以该种顺序且只包含artist等于"Picasso"和food等于 "pizza"的所有内嵌文档

      db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )

    嵌入文档中字段等于匹配:查询所有favorities字段中含有artist等于"Picasso"(这里可能含有其他的字段)的内嵌文档

      db.users.find( { "favorites.artist": "Picasso" } )

  数组上的查询:(类似于嵌套文档的查询)

    数组上的精确匹配:查询出所有badges字段是一个正好只有有"blue", "black" 这两个这种顺序的元素的数组的所有文档

      db.users.find( { badges: [ "blue", "black" ] } )

    匹配一个数组元素:查找users集合中badges字段数组中包含”black”元素(可能包含其他元素)的所有文档

      db.users.find( { badges: "black" } )

    匹配数组中指定的元素:查找出users集合中badges数组的第一个元素等于”black”的所有文档

      db.users.find( { "badges.0": "black" } )

并且小于20的所有文档

      db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )

的同时另一个元素小于20或者有一个元素同时满足大于15小于20的所有的文档

      db.users.find( { finished: { $gt: 15, $lt: 20 } } )

  嵌入文档数组查询:

的所有文档

      db.users.find( { 'points.0.points': { $lte: 55 } } )

的所有文档。

      db.users.find( { 'points.points': { $lte: 55 } } )

  指定数组文档的多个查询条件:

并且bonus等于20的所有文档

      db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )

并且同时另一个内嵌文档的bonus等于20或者有一个内嵌文档同时满足以上两个条件的所有文档。

      db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )

  查找为null或者不存在的字段:

    不能使用db.users.find( { name: null } ),这样会同时返回name字段等于null和不存在name字段的所有文档

    使用类型筛查查找为null的文档:db.users.find( { name : { $type: 10 } } ) => 只查找name字段为null的所有文档

    使用存在性筛查不存在字段的所有文档:db.users.find( { name : { $exists: false } } ) =>查找出不存在name字段的所有文档

==========================================================================================

上面讲完了查询的匹配条件,接下来是查询结果映射:也就是find函数第二个参数的意义

  返回查询的映射字段:上面我们查询方法中的 <projection>文档,映射文档用来指明返回结果中包括和排除哪些字段,下面是<projection>文档(find方法的第二个参数)

{ field1: <value>, field2: <value> ... }

  其中field字段名称,<value>的值为1或true表示在返回的文档中包含此字段,<value>的值为0或者false则返回的文档中不会包含此字段。若不显示指明_id的显示或隐藏则会默认返回文档中会包含_id字段,一个<projection>文档不能同时指定包括和排除的字段,除了排除_id字段,在显式包括字段的映射中_id字段是唯一一个可以显式排除的字段。

    1. 查询返回users集合中status值为”A”的所有文档包含文档的所有字段

      (1) db.users.find( { status: "A" } )

    2.    在查询的结果集中只返回匹配文档的name,status以及默认的_id字段,同时也可以显式排除_id字段

      (1) db.users.find( { status: "A" }, { name: 1, status: 1 } )

      (2) db.users.find( { status: "A" }, { name: 1, status: 1, _id: 0 } )

    3.    返回排除字段之外的所有的字段:返回favorites,points字段外所有字段

      (1) db.users.find( { status: "A" }, { favorites: 0, points: 0 } )

    4.    返回嵌入文档中指定字段和排除嵌入文档中的字段:(1)返回_id,status,name,和嵌入文档favorites中的food字段food字段仍然在嵌入文档favorites中。(2)返回排除嵌入文档favorites中food外的所有字段

      (1) db.users.find({ status: "A" },{ name: 1, status: 1, "favorites.food": 1 })

      (2) db.users.find({ status: "A" },{ "favorites.food": 0 })

     5.    映射数组中的嵌入文档:返回name,status字段以及points数组文档中包含bonus字段的文档

      (1) db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )

    6.    映射返回数组中特定的数组元素MongoDB包含下面映射操作符$elemMatch,$slice,以及$,他们是用来返回指定防范会数组中包含映射元素的唯一方式,不能使用数组索引来映射指定元素

==========================================================================================

  ③更新文档:

  上面的更新方法传入的参数如下:
    (1) 过滤条件文档:类似于sql的where,决定更些哪些文档      

    (2) 更新文档:类似于sql的set,指定要执行的修改或替换文档

    (3) 选项文档:若包含upsert:true,当没有匹配到文档则会创建一个新文档并插入字段

  更新文档中指定的字段:

    使用$set操作符更新favorites.artist字段为"Pisanello",更新type字段值为3.

    使用$currentDate 操作符更新 lastModified 字段的值到当前日期。如果 lastModified 字段不存在, $currentDate 会创建该字段。下面若使用updateOne函数则只会更新匹配得到的第一个文档

      db.users.updateMany(  

        { "favorites.artist": "Picasso" },

          {

            $set: { "favorites.artist": "Pisanello", type: 3 },

            $currentDate: { lastModified: true }

        }

      )

    若使用update函数来进行更新操作,则需要在选项文档中添加multi:true来指定更新单条还是所有的数据,默认更新单条数据

      db.users.update(

        { "favorites.artist": "Pisanello" },

        {

          $set: { "favorites.food": "pizza", type: 0,  },

          $currentDate: { lastModified: true }

        },

        { multi: true }

      )

  文档替换:

    使用replaceOne函数进行替换操作:将name为abc匹配到的第一个文档替换为新文档

      db.users.replaceOne(

        { name: "abc" },

        { name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }

      )

    若update函数不使用操作符则会执行替换操作

      db.users.update(

        { name: "xyz" },

        { name: "mee", age: 25, type: 1, status: "A", favorites: { "artist": "Mati", food: "ma" } }

      )

    注意:替换文档可以不同于原文档的字段。在替换文档中由于_id字段是不变的所以可以省略_id字段,若包含,则值必须和当前值相同

==========================================================================================

  ④删除文档:

  上面的过滤参数和查询的时候相同,remove方法将<justone>参数设置为1来删除匹配到的第一个文档,默认会删除所有匹配到的文档

  MongoDB入门教程到此结束,接下来会有MongoDB和springboot项目的集成使用案例

非关系型数据库MongoDB入门的更多相关文章

  1. 使用.Net+非关系型数据库MongoDB 实现LBS商家按距离排序_按离我最近排序

    .Net MongoDB LBS地理位置定位 开发过程,实现商家按距离排序 前言: 在使用美团点外卖,看电影,找好吃的时候,经常会注意到软件有一个按距离排序,找离我最近的商家,心中有一些疑问,.Net ...

  2. 数据库基础 非关系型数据库 MongoDB 和 redis

    数据库基础 非关系型数据库 MongoDB 和 redis 1 NoSQL简介 访问量增加,频繁的读写 直接访问(硬盘)物理级别的数据,会很慢 ,关系型数据库的压力会很大 所以,需要内存级的读写操作, ...

  3. 大数据时代的数据存储,非关系型数据库MongoDB

    在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...

  4. 大数据时代的数据存储,非关系型数据库MongoDB(一)

    原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...

  5. 非关系型数据库MongoDB

    爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来 ...

  6. Python3爬虫(十) 数据存储之非关系型数据库MongoDB

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.非关系型数据库NoSQL全程是Not Only SQL,非关系型数据库.NoSQL是基于键值对的,不需要经过S ...

  7. 非关系型数据库----MongoDB

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

  8. 非关系型数据库mongodb的语法模式

    from pymongo import MongoClient #连接 conn = MongoClient() #进入数据库 db = conn.edianzu #连接mydb数据库,没有则自动创建 ...

  9. 非关系型数据库MongoDB初级使用教程

    安装:官网 安装难度不大,依序即可 1.新建存储文件    完成后,打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,db文件夹即用于存储数据 2.配置文件    在b ...

随机推荐

  1. python中二维数组的建立,输入和输出

    ''' for循环: for i in range(x,y,dir): pass 首先这个区间是左闭右开 其次dir在省略的情况下默认为1,就是每次加一,也可以指定 python的数组: python ...

  2. Vue项目中导入excel文件读取成js数组

    1. 安装组件 cnpm install xlsx --save 2. 代码 <template> <span> <input class="input-fil ...

  3. read(),readline() 和 readlines() 比较

    read(),readline() 和 readlines() 比较 共同点:均可接受一个变量用以限制每次读取的数据量,但通常不使用 区别: read() [即 fileObject().read( ...

  4. shell倒计时下班时间

    #!/bin/sh offWorkTime="19:00:00" offWorkHour=${offWorkTime::} offWorkMinute=${offWorkTime: ...

  5. 火狐插件火狐黑客插件将Firefox变成黑客工具的七个插件

    目前很多插件不支持 Firefox 3.5 哦1. Add N Edit Cookies 查看和修改本地的Cookie,Cookie欺骗必备. 下载:http://code.google.com/p/ ...

  6. UNP学习第九章 基本名字与地址转换

    之前都用数值地址来表示主机(206.6.226.33),用数值端口号来标识服务器. 然而,我们应该使用名字而不是数值:名字比较容易记,数值地址可以改变但名字保持不变. 随着往IPv6上转移,数值地址变 ...

  7. LCD驱动程序架构和分析

    一.LCD驱动程序架构 1.裸机驱动代码分析 ①LCD初始化:控制器初始化,端口初始化,指明帧缓冲 ②LCD图形显示:将图形数据写入帧缓冲 void lcd_init() { lcd_port_ini ...

  8. [CSP-S模拟测试]:卡常题/b(基环树+DP)

    题目描述 $ρ$有一个二分连通无向图,$X$方点.$Y$方点均为$n$个(编号为$1\sim n$).这个二分图比较特殊,每一个$Y$方点的度为$2$,一条黑色边,一条白色边.所有黑色边权值均为$a$ ...

  9. 【已转移】【Java架构:基础技术】一篇文章搞掂:Spring

    本文篇幅较长,建议合理利用右上角目录进行查看(如果没有目录请刷新). 本文是对<SPRING实战第4版>的总结,大家也可以去仔细研读该书 [------------------------ ...

  10. 远程桌面发生身份验证错误,要求的函数不受支持【WIN10家庭】或【专业版】--解决办法

    10号更新后,远程出现如下报错 一.[家庭中文版]解决办法[亲自试验] 开启WIN家庭中文版的本地组策略 1.打开tet复制以下代码:@echo off pushd "%~dp0" ...