mongodb基本操作

下载,安装

地址

安装最后一步把勾去掉,会下载可视化工具很慢,卡死

配置环境变量

C:\Program Files\MongoDB\Server\5.0\bin

放到系统path目录下

检查配置是否成功

cmd 下 mondb,跳出版本号为sucess,并进入mondb操作系统

数据库增删

show dbs 

查看有哪些数据库

创建

use demo
db.user.insert({"name":"xiaoyu","age":22})

先 use,然后在里面添加一条数据就创建成功了

查看

use demo
show collections
db.user.find()

先use数据库

然后展示所有集合

最后选择集合并find(),注意要加括号

我们会发现刚才添加的数据,已经自动帮我们添加了一个"_id"了

{ "_id" : ObjectId("614008f2e3373d94d7745227"), "name" : "xiaoyu", "age" : 22 }

删除

show dbs
use demo
db.dropDatabase()

先切换到demo数据库

然后db.dropDatebase()就删掉了

show dbs
use demo
show collections
db.user.drop()

这个是删除一个集合

数据增删改查

增加insert

也可以直接增加一个数组,json数组

show dbs
use demo
show collections
db.user.insert(shuju)

for循环增加

for(var i=1;i<50;i++){
if(i%2==0){db.user.insert({"name":"name"+i,"age":i,"sex":"women"+i})}
else{db.user.insert({"name":"name"+i,"age":i,"sex":"men"+i})}
}

这样就批量增加了数据

remove

db.user.remove({sex:"男人"})

只要符合的就全删了,所以删之前一定要先find看下对不对,哈哈

justone

加一个justOne:true就只删除一条

db.user.remove({sex:"男人"},{justOne:true})

set

db.user.update({sex:/men/},{$set:{"sex":"男人"}})

虽然我们匹配到了很多,但是只能更改第一个数据

改数据如果有这个字段就覆盖,没有就新增

如果不出现$set,就是整条数据全部替换

multi

set只能替换一条数据,如果要把符合的全部替换的话,就需要multi:true

db.user.update({sex:/men/},{$set:{"sex":"男人"}},{multi:true})

查find

查找所有

db.user.find()

查找指定数据

如:查找name="ruru"

 db.user.find({"name":"ruru"})

结果:所有name="ruru"的数据就都出来了,name引号不加也可以的

{ "_id" : ObjectId("61401b9de3373d94d7745229"), "name" : "ruru", "age" : 32, "sex" : "women" }
{ "_id" : ObjectId("614038cc9e6dc2df9a2ffef3"), "name" : "ruru", "age" : 32 }

查询区间

如:age>20的 用$gt

db.user.find({age:{$gt:20}})

age<20的 用$lt

db.user.find({age:{$lt:20}})

age>=20 用$gte

age<=20 用$lte

10<=age<=40 中间用逗号隔开,就符合两个条件了

db.user.find({age:{$gte:10,$lte:40}})

查找name中包含ru的数据 用/ru/表示,正则表达差不多

db.user.find({name:/ru/})

查找name中以r开头的数据 用/^r/表示

db.user.find({name:/^r/})

查找name中以u结尾的数据 用/u$/表示

db.user.find({name:/u$/})

查找指定列name,age数据 意思查找出来的数据只显示我指定的内容,这里就出来的数据只显示name,age,不显示其它字段

db.user.find({},{name:1,age:1})

排序 意思按年龄大小排序,1表示升序,-1表示降序

db.user.find().sort({age:1})d

查询前5条数据 用limit(num)表示

db.user.find({name:/u$/}).limit(5)

查询5条之后的数据 用skip(num)表示

db.user.find().skip(5)

or或者查询

db.user.find({$or:[{age:20},{sex:/men/}]})

统计数量 所有查询后面加一个.count就会出现数量了

db.user.find({$or:[{age:20},{sex:/men/}]}).count()

索引

当我们的数据非常大的时候,如果从中找一条数据,mongo就会查询每一条语句来判断,这会浪费内存和时间,所以这里我们就要设置索引,来达到快速搜寻到查询结果

查看已经有的索引

db.user.getIndexes()

输出 _id是系统自带的索引,而且删除不了

[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

创建索引

db.user.createIndex( { name: 1 } )

好了,我们创建了name的索引,所以我们以后用name字段查询的时候就会非常的快,1表示升序,-1表示降序

复合索引

db.user.createIndex( { name: 1,age:1 } )

需要注意的是符合索引创建后,第一个字段和复合字段查询的时候都会时间很短,但是单独查询后面字段的时候(age)就会很长时间,就是岂不到索引的功能

删除索引

db.user.dropIndex({name:1})

这样就删掉了

唯一索引

给一个字段设置了唯一索引之后,这个字段就不能够重复了,就这么简单

db.user.createIndex( { name: 1 },{unique:true} )

好了,下面你再建一个name和前面的字段一样的试试,保证报错

账户权限配置

创建超级管理员

use admin

先进入admin数据库

db.createUser({
user:'admin',
pwd:'xiaoyu446688',
roles:[{role:'root',db:'admin'}]
})

创建好之后可以show users 查看有哪些用户

{
        "_id" : "admin.admin",
        "userId" : UUID("a91c78d8-3d2b-4e4a-8fc6-7db0bf8c044a"),
        "user" : "admin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

这里暂时只有一个admin

开启验证

虽然我们创建了账户,但是数据库没有开启验证所以还是可以直接进

C:\Program Files\MongoDB\Server\5.0\bin\mongod.cfg

修改bin目录下的mongod.cfg文件

security:
    authorization: enabled

找到security并开启authorization: enabled

重启服务

改好配置之后还要重启服务

win+R --> services.msc 然后找到MongoDb服务,重启就行了

重新连接mongo

mongo admin -u admin -p xiaoyu446688

mongo admin 固定

-u 用户名

-p 密码

如果访问远程数据库,格式如下

mongo 192.168.1.200:27017/test -u user -p password

给users(任意指定一个)数据库创建一个用户

use demo

db.createUser({user:"zhangsan",pwd:"123456",roles:[{role:"dbOwner",db:"demo"}]})

好了,我们现在用这个账户登陆试试看

mongo demo -u zhangsan -p 123456

然后show dbs 我们会发现zhangsan只有一个demo数据库

删除用户

db.dropUser('zhangsan')

关系型数据表与表之间的几种关系

聚合管道

可以对集合中的文档进行变换和组合

实际项目中用法:表关联查询,数据的统计

基本写法如:aggregate后面跟条件

db.order.aggregate([
    {
        $project:{trade_no:1,all_price:1}
    }
])

常见管道操作符

pipe description
$project 增加、删除、重命名字段
$match 条件匹配,只满足条件的文档才能进入下一阶段
$limit 限制结果的数量
$skip 跳过文档的数量
$sort 条件排序
$group 条件组合结果
$lookup 用以引入其它集合的ssh数据

$project

db.order.aggregate([{$project:{trade_no:1,all_price:1}}])

这句话的意思是,创建一个数组,然后里面的内容显示trade_no,all_price

{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
  trade_no: '111',
  all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
  trade_no: '222',
  all_price: 90 }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
  trade_no: '333',
  all_price: 20 }

$match

筛选符合条件的数据

db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$mathch:{$gte:{all_price:90}}}
])

all_price》90

这下数据更少了,更精确了

{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
  trade_no: '111',
  all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
  trade_no: '222',
  all_price: 90 }

$group

这是一个分组命令,把符合条件的分到一组

db.order_item.aggregate([
{$group:{_id:"$order_id",total:{$sum:"$num"}}}
])

_id 是给order_id分类,total是统计对应order_id的num总数

$sort

是一个排序的方法

db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}}
])

意思就是按all_price降序排列,1是升序

{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
  trade_no: '111',
  all_price: 100 }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
  trade_no: '222',
  all_price: 90 }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
  trade_no: '333',
  all_price: 20 }

$limit

就是显示几条

db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}},
{$limit:2}
])

这里就显示匹配的前2条

$skip

表示跳过几条

db.order.aggregate([
{$project:{trade_no:1,all_price:1}},
{$sort:{all_price:-1}},
{$skip:1}
])

这里就是跳过第一条

$lookup

就是把两个集合关联起来

db.order.aggregate([
    {$lookup:{
        from:"order_item",
        localField:"order_id",
        foreignField:"order_id",
        as:"items"
    }}
])

from就是和哪个集合关联

localField,就是本集合内的关联项

foreignField,就是关联集合的关联想

最后以as字段出现,意思就是localField和foreignField值相同的归集到一个字段

{ _id: ObjectId("61414c9f8f1df7a4130de57b"),
  order_id: '1',
  uid: 10,
  trade_no: '111',
  all_price: 100,
  all_num: 2,
  items: 
   [ { _id: ObjectId("61414d778f1df7a4130de57e"),
       order_id: '1',
       title: '商品鼠标1',
       price: 50,
       num: 1 },
     { _id: ObjectId("61414dfb8f1df7a4130de57f"),
       order_id: '1',
       title: '商品鼠标2',
       price: 50,
       num: 1 },
     { _id: ObjectId("61414dfb8f1df7a4130de580"),
       order_id: '1',
       title: '商品鼠标3',
       price: 20,
       num: 1 } ] }
{ _id: ObjectId("61414d228f1df7a4130de57c"),
  order_id: '2',
  uid: 7,
  trade_no: '222',
  all_price: 90,
  all_num: 2,
  items: 
   [ { _id: ObjectId("61414dfb8f1df7a4130de581"),
       order_id: '2',
       title: '牛奶',
       price: 50,
       num: 1 },
     { _id: ObjectId("61414dfb8f1df7a4130de582"),
       order_id: '2',
       title: '酸奶',
       price: 40,
       num: 1 } ] }
{ _id: ObjectId("61414d228f1df7a4130de57d"),
  order_id: '3',
  uid: 9,
  trade_no: '333',
  all_price: 20,
  all_num: 6,
  items: 
   [ { _id: ObjectId("61414e74f86d08f13497c80b"),
       order_id: '3',
       title: '矿泉水',
       price: 2,
       num: 1 },
     { _id: ObjectId("61414e88f86d08f13497c80c"),
       order_id: '3',
       title: '毛巾',
       price: 3,
       num: 5 } ] }

数据库的备份和还原

打开cmd无需进入数据库

备份

mongodump -h dbhost -d dbname -o dbdirectory
mongodump -h 127.0.0.1:27017 -d demo -o D:\github\Docusaurus_blog\docs\nodejs

还原

mongorestore -h dbhost -d dbname dbdirectory
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容

  • Mongodb的特点: 模式自由:可以把不同结构的文档存储在同一个数据库里 面向集合的储存:适合储存JSON风格文...
    姓高名旭升阅读 739评论 0 0
  • Mongodb的特点: 模式自由:可以把不同结构的文档存储在同一个数据库里 面向集合的储存:适合储存JSON风格文...
    浮_屠阅读 2,647评论 0 0
  • 一、安装mongodb 以windows平台示例,安装路径示例设置在c:\mongodb,https://www....
    小吉头阅读 1,024评论 0 1
  • mongodb介绍 1.什么是mongodb? mongodb 是由c++语言编写的,是一个基于分布式文件存储的开...
    咻咻咻滴赵大妞阅读 282评论 0 0
  • 原文链接:https://blog.csdn.net/My_Way666/article/details/8437...
    eryk_yang阅读 249评论 0 0