草庐IT

二、MongoDB简介及基本操作

童懵 2023-05-07 原文

mongodb是一个基于文档的强大、灵活、易于扩展的通用型数据库。是基于分布式文件存储的数据库。其由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

mongodb也是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

目录

一、MongoDB简介

        1.1 简介

        1.2 基本概念

二、MongoDB常规操作

        2.1 数据库操作

        2.2 集合操作

        2.3 数据类型

        2.4 文档操作


一、MongoDB简介

        1.1 简介

        mongodb是一个基于文档的强大、灵活、易于扩展的通用型数据库。是基于分布式文件存储的数据库。其由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。其主要特点如下:

        (1)其使用文档来替代关系型数据库表的结构,每条数据不在要求其有无和一致性的类型。

        (2)每个文档可以具备丰富的层次结构,而不是并列的属性数据。当然对于检索等情况下也不是很建议这样处理。

        (3)使用横向扩展技术,面向文档的数据模型更易扩展。

        (4)具备更加丰富、独特、易用的检索功能。

        (5)基于内存的储存检索,性能更佳。

        1.2 基本概念

                数据库:

      数据库和传统的关系型数据库差不多的概念,每个数据库含有多个集合,每个数据库最后会作为文件储存至服务器中,另外还有一些特殊的数据库进行了保留如下:

        admin:类似于root数据库,如果将用户添加至admin数据库将获取所有数据库的权限,其中一些比如查找所有数据库、关闭服务器的服务端命令只能从这里运行。

        local:存储当前服务器所有本地集合的数据库,永远不可以复制。

        config:主要是存储分片等信息

                集合(table):

      相当于表结构,一个数据库下有多个集合。

      但是与传统关系型数据库不同,关系型数据库譬如mysql,postgresql等都需要比较确切的表结构,但是对于MongoDB的集合,可以存储不同结构的数据,eg:

        {"name":"张三","age":"15"}

        {"name":"李四","age":16,"height":180}

        {"title":"我的世界"}

     对于上述数据都可以存储在一个集合里面,在该集合的上述三条数据,不仅仅是字段不同,连同一个字段age的数据类型都不同,这边是集合的动态扩展。虽然MongoDB支持该方式,但是作为开发还是建议将不同类型的数据分开到不同的集合之中更为稳妥:

        首先,将各种类型的数据放到同一个数据库之中,后续进行管理查看的时候需要进行针对性的筛选很费劲;

        其次,对于同名但是不同含义的字段检索存在歧义;

        最后补充,在进行数据检索时,包括索引创建等,对于同一类数据进行操作更为快捷,其体现在索引创建上,进行检索时查找数据量级上等。

                文档 (行数据)

      文档则相当于传统关系型数据的行数据,对于集合中的介绍,我们基本也了解到了集合的结构并非是非常固定的结构,但是对于其中还是要注意,文档不能出现相同名称的属性。

                主键

     主键是MongoDB比较特殊的存在,一个mysql表可以不设置主键,但是对于MongoDB是一定会有一个唯一性的Id,你可以使用一个确定的Id值,也可以不进行设置,由MongoDB生成一个唯一的ObjectId作为Id。ObjectId作为的Id可以适配分布式的情况,具体详见官网介绍:ObjectId — MongoDB Manual

二、MongoDB常规操作

        2.1 数据库操作

             2.1.1 查看

                       MongoDB对于数据库的查看 

#推荐
show dbs
#不推荐
show databases

              

             2.1.2 创建

                       对于数据库的创建,MongoDB并未提供一个独立的接口,而是使用类似于mysql这种use <database> 的语法,当使用的数据库不存在时则进行创建

# 切入 test 数据库,此时触发 test 数据库的创建工作
use test
db.myCollection.insertOne( { x: 1 } );

【注】 当只是use <new database> 时,没有进行集合、文档操作,此时不会创建该数据库,只有真正操作集合后才会创建。

             2.1.3 删除

对于数据库的删除,只需要简单的进入到该数据库执行db.dropDatabase()方法即可

# 删除代码执行前最好是进入改数据库后执行  use <database>
db.dropDatabase()

        2.2 集合操作

                2.2.1 集合创建

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: (可选)参数的集合

options 可以是如下参数:

参数名类型描述
capped布尔(可选)如果为 true,则创建最大容量的集合,如果超出容量capped集合将自动的覆盖旧数据,当设置为true时,则需要指定size参数大小进行设置
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。【3.4版本开始移除该参数,详见[SERVER-19067] Warn at creation that autoIndexId:false is deprecated - MongoDB Jira
size数值(可选)为固定集合指定一个最大值,即字节数。
如果 capped 为 true,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

[注]在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

示例:

 1. 直接创建一个集合:

        db.createCollection("<collectionsName>")

2. 创建一个带有options操作的集合:

 db.createCollection("mycol", { capped : true, size : 6142800, max : 10000 } )

3.也可以直接插入数据,这样也会自动创建一个集合

        

db.tutorialspoint.insert({"name" : "tutorialspoint"})

        

                2.2.2 删除集合

集合删除很简单,直接db.<collectionName>.drop()

db.tutorialspoint.drop()

        2.3 数据类型

MongoDB supports many datatypes. Some of them are −

  • String − This is the most commonly used datatype to store the data. String in MongoDB must be UTF-8 valid.

  • Integer − This type is used to store a numerical value. Integer can be 32 bit or 64 bit depending upon your server.

  • Boolean − This type is used to store a boolean (true/ false) value.

  • Double − This type is used to store floating point values.

  • Min/ Max keys − This type is used to compare a value against the lowest and highest BSON elements.

  • Arrays − This type is used to store arrays or list or multiple values into one key.

  • Timestamp − ctimestamp. This can be handy for recording when a document has been modified or added.

  • Object − This datatype is used for embedded documents.

  • Null − This type is used to store a Null value.

  • Symbol − This datatype is used identically to a string; however, it's generally reserved for languages that use a specific symbol type.

  • Date − This datatype is used to store the current date or time in UNIX time format. You can specify your own date time by creating object of Date and passing day, month, year into it.

  • Object ID − This datatype is used to store the document’s ID.

  • Binary data − This datatype is used to store binary data.

  • Code − This datatype is used to store JavaScript code into the document.

  • Regular expression − This datatype is used to store regular expression.

        2.4 文档操作

                2.4.1 新增

1. 使用insert(documents)方法

#单个插入
db.mycol.insert({"name":"张三","age":18})

#多个插入
db.mycol.insert([{"name":"李四","age":18},{"name":"王五"}])

2.  insertOne(document)方法

db.mycol.insertOne({"name":"张三One","age":18})

3. insertMany(documents)方法

 db.mycol.insertMany([{"name":"李四M","age":18},{"name":"王五M"}])

                2.4.2 删除

文档删除主要是使用drop方法,但是要注意对于capped collection无法进行删除操作,以下则是进行具体操作的示例,这里先造点数据

db.test.insert([{"name":"李四","age":18},{"name":"王五"},{"name":"赵六","age":18},{"name":"Tom","age":19},{"name":"Anna","age":20}])

示例:

  1. 简单进行条件删除:

db.test.remove({'name':'王五'})

2. 在version2.6 及其后续版本提供了更为复杂的删除方案:

        db.collection.remove(
                  <query>,
                   {
                             justOne: <boolean>,
                             writeConcern: <document>,
                             collation: <document>,
                             let: <document> // Added in MongoDB 5.0
                   }
        )

参数

类型

描述

query

document

使用query operators指定删除条件。要删除集合中的所有文档,请传递空文档({})。

justOne

boolean

可选的。要将删除限制为仅一个文档,请设置为true。省略使用false的默认 value 并删除符合删除条件的所有文档。

writeConcern

document

可选的。表示写关注的文件。省略使用默认写入问题。见写关注。 如果在事务中运行,请不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。

collation

document

可选的。 指定要用于操作的排序规则。 排序规则允许用户为 string 比较指定 language-specific 规则,例如字母和重音标记的规则。 排序规则选项具有以下语法: collation:{ locale:<string>, caseLevel:<boolean>, caseFirst:<string>, strength:<int>, numericOrdering:<boolean>, alternate:<string>, maxVariable:<string>, backwards :<boolean> } 指定排序规则时,locale字段是必填字段;所有其他校对字段都是可选的。有关字段的说明,请参阅整理文件。 如果未指定排序规则但集合具有默认排序规则(请参阅db.createCollection()),则操作将使用为集合指定的排序规则。 如果没有为集合或操作指定排序规则,MongoDB 使用先前版本中用于 string 比较的简单二进制比较。 您无法为操作指定多个排序规则。对于 example,您不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能对查找使用一个排序规则,而对排序使用另一个排序规则。 version 3.4 中的新内容。

对于mongodb的基本操作基本讲解完毕,那么下一章节开始介绍如何去查询内容。

上一章:MongoDB安装(CentOS7)_童懵的博客-CSDN博客

下一章:三、mongdb 查询

参考文献:

MongoDB Documentation

MongoDB Tutorial

有关二、MongoDB简介及基本操作的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  4. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  8. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  9. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  10. ruby-on-rails - Rails 基本 Base64 身份验证 - 2

    我正在尝试复制此GETcurl请求:curl-D--XGET-H"Authorization:BasicdGVzdEB0YXByZXNlYXJjaC5jb206NGMzMTg2Mjg4YWUyM2ZkOTY2MWNiNWRmY2NlMTkzMGU="-H"Content-Type:application/json"http://staging.example.com/api/v1/campaigns在Ruby中,通过电子邮件+apikey生成身份验证:auth="Basic"+Base64::encode64("test@example.com:4c3186288ae23fd9661c

随机推荐