欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MongoDB入门教程东拼西凑瓜皮版

程序员文章站 2022-03-09 10:47:24
MongoDB基础教程MongoDB介绍WHATWHYHOW启动服务连接MongoDBMongoDB创建数据库MongoDB删除数据库MongoDB插入文档MongoDB更新文档MongoDB删除文档MongoDB查询文档MongoDB的Limit和Skip方法MongoDB排序MongoDB索引MongoDB聚合MongoDB介绍由于新公司要用到MongoDB,所以现学现卖一波。这里记录都是一些关于MongoDB非常基础的操作。还有很多知识待后面学习慢慢深入吧!WHAT什么是MongoDB?1、...

MongoDB介绍

由于新公司要用到MongoDB,所以现学现卖一波。这里记录都是一些关于MongoDB非常基础的操作,也是从各个文档或者CSDN中看来的,相当于自己做了一个整理。还有很多知识待后面学习慢慢深入吧!

WHAT

什么是MongoDB?
1、 MongoDB是一个NoSQL数据库,它是跨平台的,基于分布式文件存储的数据库,由C++语言编写的(这点很重要,则表示在Linux下需要安装gcc环境)。MongoDB是以文档的形式存储数据,数据结构由键值(key:value)对组成,类似JSON。

MongoDB结构,最小的单位为文档(类似MySQL的行),每一个文档用的是BSON形式来存储(类似JSON),文档的上一层为集合(类似MySQL的表),再上一级为库(类似MySQL的数据库)。
MongoDB入门教程东拼西凑瓜皮版
安装步骤啥的就自己操作吧。这里就给个链接吧:MongoDB安装

WHY

为什么要使用MongoDB?
1、MongoDB是为快速开发互联网Web引用而设计的数据库系统。其数据模型和持久化策略就是为了构建高读写吞吐量和高自动备灾伸缩性的系统。无论系统需要单个还是多个节点,MongoDB都可以提供高性能。
但是使用MongoDB最大的理由可能就是它只管的数据模型。MongoDB在文档中存储数据而不是在行里。什么是文档呢?
MongoDB入门教程东拼西凑瓜皮版
上图就是一条存储用户信息的文档,这种数据模型的优势就是,当我们需要为每个用户存储多个email的时候,在关系型数据库中需要创建单独的email表,然后通过外键进行关联。然而使用MongoDB的话,就十分简单了。
MongoDB入门教程东拼西凑瓜皮版
MongoDB的文档格式是基于JSON的,在数据经常变化的时候,我们只需要存储一个结构化文档即可,而不用担心数据模型的变化。
MongoDB入门教程东拼西凑瓜皮版
而如果使用关系型数据库来表示上图的数据时,则显得麻烦很多
MongoDB入门教程东拼西凑瓜皮版
我们也可以看到,除了支持丰富的数据结构之外,文档不需要遵守严格的数据定义schema。我们在表里存储行,每个表都有严格的schema,指定每个列的数据类型。如果某行需要拓展字段,就必须修改表结构。而在MongoDB中,集合不需要定义任何schema。理论上每个集合中的文档都可以拥有不同的数据结构,但是实际上在操作的时候,集合中的文档都是相对一致的。
2、ad hoc查询 : 就是主动查询模式,是指不需要事先定义系统接收何种查询。关系型数据库有个属性,它们忠实的执行格式正确的SQL查询。但是不是所有的数据库都支持动态查询,例如键值存储的查询只支持一个领域的查询:key键。键值存储数据库牺牲了丰富的查询功能,来换取更简单的伸缩模型。而MongoDB的设计目标之一就是保留大部分关系型数据库的功能。
举个例子:查询所有包含标签politics并且有10个以上投票的文章,才用SQL写的话就是
MongoDB入门教程东拼西凑瓜皮版
而在MongoDB中,则是这样写:
MongoDB入门教程东拼西凑瓜皮版
更多的关于MongoDB的一些特性和底层的原理之后再记录吧。

HOW

学习一下MongoDB的指令,在MongoDB中,是区分大小写的。

启动服务

service mongod start

确认MongoDB已经成功启动,查看日志:

less /var/log/mongodb/mongod.log

验证MongoDB已经启动,通过检查日志文件的内容:

[initandlisten] waiting for connections on port 27017

port是MongoDB监听的端口,修改的话在配置文件/etc/mongod,conf设置net.port

连接MongoDB

使用用户名和密码连接到MongoDB服务器,其格式是:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

其中options有很多选项:
MongoDB入门教程东拼西凑瓜皮版

例如:

mongodb://mongo_admin:AxB6_w3r@localhost/

即用户mongo_admin使用Ax……密码登录本地服务器

mongodb://localhost,localhost:27018,localhost:27019

连接三台服务器

mongodb://host1,host2,host3/?slaveOk=true

连接三台服务器,写入操作在主服务器,分布查询到从服务器

MongoDB创建数据库

语法:use DATABASE_NAME
MongoDB入门教程东拼西凑瓜皮版

如果数据库不存在,就创建数据库,否则就切换到指定的数据库
查看所有数据库,可以使用 show dbs 命令。
MongoDB入门教程东拼西凑瓜皮版
MongoDB中默认的数据库为test,如果没有创建新的数据库,集合将存放在test中

MongoDB删除数据库

语法:db.dropDatabase()
删除当前数据库,默认为test,可以使用 db查看当前数据库名
MongoDB入门教程东拼西凑瓜皮版

删除集合语法:db.collection.drop()

MongoDB插入文档

文档的数据结构和JSON基本语义,所有存储在集合中的数据都是BSON格式。BSON是一种类json的二进制形式的存储格式

插入文档使用 insert() 或者save()

db.COLLECTION_NAME.insert(document)

例子:

db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'w3cschool',
    url: 'http://www.w3cschool.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

上例中的col就是我们的集合名。若该集合不在数据库中,MongoDB会自动创建该集合并插入文档
查看已经插入的文档:

db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "w3cschool", "url" : "http://www.w3cschool.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

我们也可以将数据定义为一个变量:

document=({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'w3cschool',
    url: 'http://www.w3cschool.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
});

执行后显示:

{
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "w3cschool",
        "url" : "http://www.w3cschool.cn",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

执行插入操作:

> db.col.insert(document)
WriteResult({ "nInserted" : 1 }) 

插入文档也可以使用 db.col.save(document)命令。如果不指定_id字段,save和insert类似。如果指定了_id,则会跟新该_id的数据

MongoDB更新文档

MongoDB使用 update() 函数更新数据
语法:db.COLLECTION_NAME.update(criteria,objNew,upsert,multi)
update函数接受以下4个参数:

  • criteria:update的查询条件,类似SQL的update查询内where后面的
  • objNew:update的对象和一些更新的操作符,可以理解为SQL中update查询内的set
  • upsert:如果不存在update的记录,是否插入objNew,true为插入,默认为false不插入
  • multi:默认为false,只更新找到的第一条记录,如果这个参数是true,就将查询出来的记录全部更新。

例子:
使用 myinfo作为数据库名称,集合名为userdetails
插入数据:

 > document=({"user_id" : "MNOPBWN","password" :"MNOPBWN" ,"date_of_join" : "16/10/2010" 
,"education" :"M.C.A." , "profession" : "CONSULTANT","interest" : "MUSIC","community_name" :["MODERN MUSIC", 
"CLASSICAL MUSIC","WESTERN MUSIC"],"community_moder_id" : ["MR. BBB","MR. JJJ","MR MMM"],"community_members" : 
[500,200,1500],"friends_id" : ["MMM123","NNN123","OOO123"],"ban_friends_id" :["BAN123","BAN456","BAN789"]});

> db.userdetails.insert(document)
> document=({"user_id" : "QRSTBWN","password" :"QRSTBWN" ,"date_of_join" : "17/10/2010" ,"education" :"M.B.A." 
, "profession" : "MARKETING","interest" : "MUSIC","community_name" :["MODERN MUSIC", "CLASSICAL MUSIC","WESTERN 
MUSIC"],"community_moder_id" : ["MR. BBB","MR. JJJ","MR MMM"],"community_members" : [500,200,1500],"friends_id" :
 ["MMM123","NNN123","OOO123"],"ban_friends_id" :["BAN123","BAN456","BAN789"]});
 
 > db.userdetails.insert(document)

更新操作:想要将userdetails集合中的user_id为QRSTBWN的password字段修改为NEWPASSWORD,那我们就可以使用update命令来实现

> db.userdetails.update({"user_id" : "QRSTBWN"},{"user_id" : "QRSTBWN","password" :"NEWPASSWORD" 
,"date_of_join" : "17/10/2010" ,"education" :"M.B.A." , "profession" : "MARKETING","interest" : 
"MUSIC","community_name" :["MODERN MUSIC", "CLASSICAL MUSIC","WESTERN MUSIC"],"community_moder_id" : ["MR. 
BBB","MR. JJJ","MR MMM"],"community_members" : [500,200,1500],"friends_id" : ["MMM123","NNN123","OOO123"],"ban_friends_id" :["BAN123","BAN456","BAN789"]});

更多实例:
只更新第一条:

db.test0.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

全部更新

db.test0.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只添加第一条

 db.test0.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false ); 

全部添加

db.test0.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); 

全部更新

db.test0.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一条

 db.test0.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

$inc的含义及用法
对一个数字字段field增加value
用法:{ $inc : { field : value } }
例如:

> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 16, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", "test4" : "OK", "test5" : "OK" }
> db.test0.update( { "_id" : 15 } , { $inc : { "count" : 1 } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 17, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", "test4" : "OK", "test5" : "OK" }

MongoDB删除文档

MongoDB蚕蛹 **remove()**来移除集合中的数据。
建议:在执行remove函数之前,先执行find命令来判断执行的条件是否正确
语法:

db.collection.remove(
   <query>,
   <justOne>
)

如果MongoDB的版本是2.6之后的,语法格式为:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

参数说明

  • query:可选,删除文档的条件
  • justOne:可选,如果是true或者1,则只删除一个文档
  • writeConcern:可选,抛出异常的级别

例子:
以下文档执行两次插入操作:

>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'w3cschool',
    url: 'http://www.w3cschool.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

使用find函数查询数据

> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "w3cschool", "url" : "http://www.w3cschool.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "w3cschool", "url" : "http://www.w3cschool.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

接下来移除title为“MongoDB教程”的文档

>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 })           # 删除了两条数据
>db.col.find()
……                                        # 没有数据

如果只想删除第一条记录,则设置justOne为1

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

删除所有数据

>db.col.remove({})

MongoDB查询文档

语法:db.COLLECTION_NAME.find()
find()方法是以非结构化的方式来显示所有文档。
如果需要以易读的方法来读取文档,可以使用 **pretty()**方法
实例:

> db.col.find().pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "w3cschool",
        "url" : "http://www.w3cschool.cn",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

除了find以外,还有一个findOne()方法,只返回一个文档。
MongoDB入门教程东拼西凑瓜皮版
MongoDB的AND条件
MongoDB的find方法可以传入多个key,每个key用逗号隔开。语法如下

>db.col.find({key1:value1, key2:value2}).pretty()

实例:

> db.col.find({"by":"w3cschool", "title":"MongoDB 教程"}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "w3cschool",
        "url" : "http://www.w3cschool.cn",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

MongoDB的OR条件
使用**$or**关键字来实现or条件查询,语法为:

>db.col.find(
   {
      $or: [
	     {key1: value1}, {key2:value2}
      ]
   }
).pretty()

实例:

>db.col.find({$or:[{"by":"w3cschool"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "w3cschool",
        "url" : "http://www.w3cschool.cn",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

AND和OR联合使用

>db.col.find({"likes": {$gt:50}, $or: [{"by": "w3cschool"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一个 Nosql 数据库",
        "by" : "w3cschool",
        "url" : "http://www.w3cschool.cn",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

等同于SQL中:'where likes>50 AND (by = 'w3cschool' OR title = 'MongoDB 教程')'
MongoDB条件操作符
MongoDB入门教程东拼西凑瓜皮版
这些都还比较简单。。没啥子说的,搞几个例子
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版
条件操作符$type
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
MongoDB中可以使用的类型如下:
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版

MongoDB的Limit和Skip方法

Limit()方法用于指定从MongoDB中返回的记录条数
语法:

>db.COLLECTION_NAME.find().limit(NUMBER)

实例:

>db.mycol.find({},{"title":1,_id:0}).limit(2)
{"title":"MongoDB Overview"}
{"title":"NoSQL Overview"}
>

如果没有指定limit,就会返回集合中所有的数据

skip()方法用来跳过指定数量的数据。
语法:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

实例:

>db.mycol.find({},{"title":1,_id:0}).limit(1).skip(1)
{"title":"NoSQL Overview"}

只显示第二条文档数据
skip()方法默认参数是0

MongoDB排序

MongoDB使用sort()方法来对数据进行排序。1为升序,-1为降序
基本语法:

>db.COLLECTION_NAME.find().sort({KEY:1})

实例:
按照title字段进行降序排列:

>db.mycol.find({},{"title":1,_id:0}).sort({"title":-1})
{"title":"Tutorials Point Overview"}
{"title":"NoSQL Overview"}
{"title":"MongoDB Overview"}

MongoDB索引

索引能够很大程度上提升查询的效率,如果没有索引的话,MongoDB在查询数据时必须臊面集合中每个文档,并选取其中符合查询条件的记录,这样做的查询效率是很低下的。索引是特殊的数据结构,索引存储在一个易于便利读取的数据集合中,索引是对数据库表中一列或者多列的值进行排序的一种结构
索引具体的内容后续再整理吧。

MongoDB使用ensureIndex()方法来创建索引
语法:

>db.COLLECTION_NAME.ensureIndex({KEY:1})

key值为要创建的索引字段,1为指定按升序创建索引,若想要倒序,就指定为-1
实例:

>db.mycol.ensureIndex({"title":1})

也可以设置多个字段创建索引,在关系型数据库中这个叫复合索引

>db.mycol.ensureIndex({"title":1,"description":-1})

MongoDB入门教程东拼西凑瓜皮版

MongoDB聚合

MongoDB中聚合(aggregate)主要用于处理数据(平均值、求和等等),并返回计算后的数据结果,有点类似SQL中的sun,count等等
aggregate()方法:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

实例:计算每个作者所写文章数

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{
   "result" : [
      {
         "_id" : "w3cschool.cn",
         "num_tutorial" : 2
      },
      {
         "_id" : "Neo4j",
         "num_tutorial" : 1
      }
   ],
   "ok" : 1
}

以上语句其实类似于 select by_user, count(*) from mycol group by by_user

常用的一些聚合表达式:
MongoDB入门教程东拼西凑瓜皮版
管道的概念
管道在Unix和Linux中一般用于将当前命令输出的结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕之后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其他文档。
聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名,增加或者删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。
  • $limit:用来限制MongoDB聚合管道返回的文档数
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
  • $group:将集合中的文档分组,可用于统计
  • $sort:将输入文档排序后输出
  • $groNear:输出接近某一地理位置的有序文档

实例:
MongoDB入门教程东拼西凑瓜皮版
MongoDB入门教程东拼西凑瓜皮版

还有一些关于MongoDB的复制,分片,备份,监控等等的操作,在后续的学习中再慢慢记录

本文地址:https://blog.csdn.net/weixin_38147296/article/details/108974195