python学习之路

MongoDB快速入门,掌握这些刚刚好!

2020-06-08  本文已影响0人  macrozheng

虽说现在关系型数据库还是主流,但是面对某些需求的时候,需要非关系型数据库来补充它,学习一个主流的NoSQL数据库还是很有必要的。MongoDB是一个功能丰富的NoSQL数据库,本文整理了它最常用的部分形成了这篇入门教程,希望对大家有所帮助。

SpringBoot实战电商项目mall(30k+star)地址:https://github.com/macrozheng/mall

简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。

安装

以前写的MongoDB安装教程是基于3.2版本的,发现有的朋友使用新版本安装有问题,这次我们使用最新版本再来安装一次,本文所使用的MongoDB版本为4.2.5,总的来说,新版本的安装更简单了。

Windows下的安装

image image image image image image
sc.exe delete MongoDB

Linux下的安装

docker pull mongo:4.2.5
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5 --auth
docker exec -it mongo mongo
use admin
db.createUser({ 
    user: 'mongoadmin', 
    pwd: 'secret', 
    roles: [ { role: "root", db: "admin" } ] });
db.auth("mongoadmin","secret")
image

客户端工具

MongoDB的客户端工具有很多,上面没安装的MongoDB Compass就是其中之一,另外Navicat 15版本也有MongoDB的管理功能。这里我们使用的是一款免费的客户端工具Robo 3T(以前叫Robomongo)。

image image image image

相关概念

MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。

SQL概念 MongoDB概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
primary key primary key 主键,MongoDB自动将_id字段设置为主键

数据库操作

> use test
switched to db test
> db.article.insert({name:"MongoDB 教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
> db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

集合操作

> use test
switched to db test
> db.createCollection("article")
{ "ok" : 1 }
> show collections
article
> db.article.drop()
true
> show collections

文档操作

上面的数据库和集合操作是在MongoDB的客户端中进行的,下面的文档操作都是在Robomongo中进行的。

插入文档

db.collection.insert(document)
db.article.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'Andy',
    url: 'https://www.mongodb.com/',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})
db.article.find({})
{
    "_id" : ObjectId("5e9943661379a112845e4056"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
}

更新文档

db.collection.update(
   <query>,
   <update>,
   {
     multi: <boolean>
   }
)
# query:修改的查询条件,类似于SQL中的WHERE部分
# update:更新属性的操作符,类似与SQL中的SET部分
# multi:设置为true时会更新所有符合条件的文档,默认为false只更新找到的第一条
db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
db.collection.save(document)
db.article.save({
    "_id" : ObjectId("5e9943661379a112845e4056"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
})

删除文档

db.collection.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
# query:删除的查询条件,类似于SQL中的WHERE部分
# justOne:设置为true只删除一条记录,默认为false删除所有记录
db.article.remove({'title':'MongoDB 教程'})

查询文档

db.collection.find(query, projection)
# query:查询条件,类似于SQL中的WHERE部分
# projection:可选,使用投影操作符指定返回的键
db.article.find()
/* 1 */
{
    "_id" : ObjectId("5e994dcb1379a112845e4057"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "Andy",
    "url" : "https://www.mongodb.com/",
    "tags" : [ 
        "mongodb", 
        "database", 
        "NoSQL"
    ],
    "likes" : 50.0
}

/* 2 */
{
    "_id" : ObjectId("5e994df51379a112845e4058"),
    "title" : "Elasticsearch 教程",
    "description" : "Elasticsearch 是一个搜索引擎",
    "by" : "Ruby",
    "url" : "https://www.elastic.co/cn/",
    "tags" : [ 
        "elasticearch", 
        "database", 
        "NoSQL"
    ],
    "likes" : 100.0
}

/* 3 */
{
    "_id" : ObjectId("5e994e111379a112845e4059"),
    "title" : "Redis 教程",
    "description" : "Redis 是一个key-value数据库",
    "by" : "Andy",
    "url" : "https://redis.io/",
    "tags" : [ 
        "redis", 
        "database", 
        "NoSQL"
    ],
    "likes" : 150.0
}
操作 格式 SQL中的类似语句
等于 {<key>:<value>} where title = 'MongoDB 教程'
小于 {<key>:{$lt:<value>}} where likes < 50
小于或等于 {<key>:{$lte:<value>}} where likes <= 50
大于 {<key>:{$gt:<value>}} where likes > 50
大于或等于 {<key>:{$gte:<value>}} where likes >= 50
不等于 {<key>:{$ne:<value>}} where likes != 50
db.article.find({'title':'MongoDB 教程'})
db.article.find({'likes':{$gt:50}})
db.article.find({'title':'MongoDB 教程','by':'Andy'})
db.article.find({$or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})
db.article.find({"likes": {$gt:50}, $or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})

其他操作

Limit与Skip操作

db.collection.find().limit(NUMBER)
db.article.find().limit(2)
db.collection.find().limit(NUMBER).skip(NUMBER)
db.article.find().limit(2).skip(1)

排序

db.collection.find().sort({KEY:1})
db.article.find().sort({likes:-1})

索引

db.collection.createIndex(keys, options)
# background:建索引过程会阻塞其它数据库操作,设置为true表示后台创建,默认为false
# unique:设置为true表示创建唯一索引
# name:指定索引名称,如果没有指定会自动生成
db.article.createIndex({"title":1,"description":-1}, {background: true})
db.article.getIndexes()
/* 1 */
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.article"
    },
    {
        "v" : 2,
        "key" : {
            "title" : 1.0,
            "description" : -1.0
        },
        "name" : "title_1_description_-1",
        "ns" : "test.article",
        "background" : true
    }
]

聚合

db.collection.aggregate(AGGREGATE_OPERATION)
操作符 描述
$sum 计算总和
$avg 计算平均值
$min 计算最小值
$max 计算最大值
db.article.aggregate([{$group : {_id : "$by", sum_count : {$sum : 1}}}])
/* 1 */
{
    "_id" : "Andy",
    "sum_count" : 2.0
}

/* 2 */
{
    "_id" : "Ruby",
    "sum_count" : 1.0
}
db.article.aggregate([{$group : {_id : "$by", avg_likes : {$avg : "$likes"}}}])
/* 1 */
{
    "_id" : "Andy",
    "avg_likes" : 100.0
}

/* 2 */
{
    "_id" : "Ruby",
    "avg_likes" : 100.0
}

正则表达式

db.article.find({title:{$regex:"教程"}})
db.article.find({title:{$regex:"elasticsearch",$options:"$i"}})

结合SpringBoot使用

具体参考:《mall整合Mongodb实现文档操作》

公众号

mall项目全套学习教程连载中,关注公众号第一时间获取。

公众号图片
上一篇 下一篇

猜你喜欢

热点阅读