转载:https://www.cnblogs.com/zhoukebo/p/9518578.html

  本文分为以下四块简单介绍非关系型数据库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”的所有文档

  指定and条件:在集合users中查找出status等于”A”和age小于30的所有文档

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

  指定or条件:在集合users中查找出所有status等于”A”或者age小于30的所有文档

    db.users.find({

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

    })

  指定and和or条件:在集合users中查找出status等于”A”并且要么age小于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" } )

    指定数组元素多个查询条件单个数组元素满足查询条件需要使用$elemMatch:查找出集合users中finished数组中至少有一个元素大于15并且小于20的所有文档

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

    元素组合满足条件:查找出users集合中一个元素大于15的同时另一个元素小于20或者有一个元素同时满足大于15小于20的所有的文档

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

  嵌入文档数组查询:

    使用数组索引匹配嵌入文档中的字段:查找出points数组第一个文档元素中的points字段小于等于55的所有文档

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

    不指定索引匹配字段:查找出points数组中至少有一个嵌入文档的points字段小于或等于55的所有文档。

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

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

    单个元素满足查询条件(使用$elemMatch):查询users集合中points数组中至少有一个内嵌文档的points字段小于等于70并且bonus等于20的所有文档

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

    元素组合满足查询条件:查询users集合中points数组中的一个内嵌文档的points字段小于等于70并且同时另一个内嵌文档的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项目的集成使用案例

posted on 2019-07-17 09:35  诉说静风  阅读(185)  评论(0编辑  收藏  举报

Live2D
快把你的小爪子拿开!