mongodb 的安装

在ubuntu系统上安装教程

mongodb服务端的启动

  • 默认端口:27017

  • 默认配置文件的位置:/etc/mongod.conf

  • 默认日志的位置:/var/log/mongodb/mongod.log

启动和停用mongodb server

  • 启动: sudo service mongod start

  • 停止: sudo service mongod stop

  • 重启: sudo service mongod restart

查看启动状态:sudo service mongod status 或者 ps aux | grep mongod

启动和停用 mongodb clients

  • 启动本地客户端: mongosh      等价为  mongosh "mongodb://localhost:27017"

  • 远程链接格式:mongosh "mongodb://<username>:<password>@<host>:<port>/<db_name>"

  • 查看帮助:mongosh –help

  • 退出:exit或者ctrl+c

mongosh的命令使用

  • 对数据库的操作

    • 查看当前正在使用的数据库:db
    • 查看所有的数据库:show dbs  或者 show databases
    • 切换数据库:use db_name       其中:db_name为show dbs后返回的数据库名
    • 删除当前的数据库:db.dropDatabase()
  • 对collection的操作

  • 手动创建集合:格式: db.createCollection(name,options)

eg.   db.createCollection("first_collection")

db.createCollection("first_collection", { capped : true, size : 10 } )

参数capped:默认值为false表示不设置上限,值为true表示设置上限

参数size:集合所占用的字节数。 当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时, 会将之前的数据覆盖,单位为字节.

  • 检查集合是否设定上限: db.<集合名>.isCapped()
  • 查看集合:show collections
  • 删除集合:db.<集合名称>.drop()

MongoDB的常见数据类型

  • Object ID: 文档或数据的ID,主键
  • String: 字符串,最常用,必须是有效的UTF-8
  • Boolean: 存储一个布尔值,true或false
  • Integer: 整数可以是32位或64位,这取决于服务器
  • Double: 浮点数
  • Arrays: 数组/列表
  • Object: mongodb中的一条数据/文档,即文档嵌套文档
  • Null: 存储null值
  • Timestamp: 时间戳,表示从1970-1-1到现在的总秒数
  • Date: 存储当前日期或时间的UNIX时间格式

【知识点】

  • 每条文档数据都有一个id属性,保证每条文档数据的唯一性,mongodb默认使用id作为主键
  • 可以手动设置id的值,如果没有提供,那么MongoDB为每条文档数据提供了一个独特的id, 类型为objectID
  • objectID是一个12字节的十六进制数,每个字节两位,一共是24位的字符串:
    • 前4个字节为当前时间戳
    • 接下来3个字节的机器ID
    • 接下来的2个字节中MongoDB的服务进程id
    • 最后3个字节是简单的增量值

mongodb的增、删、改、查命令

增加(插入)数据

mongodb提供了两个插入命令用于新增数据,如果插入数据时,集合(collection)不存在,则会插入新数据时候创建新的集合。并且插入文档时,如果不指定_id参数,MongoDB会为文档自动分配一个唯一的ObjectId。

  • 插入一条文档数据: db.collection.insertOne()

  • 插入多条文档数据: db.collection.insertMany()

例子:

插入一条文档数据

use sample_mflix
db.movies.insertOne({title: "The Favourite",genres: [ "Drama", "History" ],runtime: 121,rated: "R",year: 2018,directors: [ "Yorgos Lanthimos" ],cast: [ "Olivia Colman", "Emma Stone", "Rachel Weisz" ],type: "movie"}
)

插入多条文档数据:

use sample_mflix
db.movies.insertMany([{title: "Jurassic World: Fallen Kingdom",genres: [ "Action", "Sci-Fi" ],runtime: 130,rated: "PG-13",year: 2018,directors: [ "J. A. Bayona" ],cast: [ "Chris Pratt", "Bryce Dallas Howard", "Rafe Spall" ],type: "movie"},{title: "Tag",genres: [ "Comedy", "Action" ],runtime: 105,rated: "R",year: 2018,directors: [ "Jeff Tomsic" ],cast: [ "Annabelle Wallis", "Jeremy Renner", "Jon Hamm" ],type: "movie"}
])

查询结果可以用:

db.movies.find( { title: "The Favourite" } )

db.movies.find( {} )

删除数据

  • 删除多条文档数据, use db.collection.deleteMany()

  • 删除一条文档数据, use db.collection.deleteOne()

例子:

删除collection的所有文档数据

use sample_mflixdb.movies.deleteMany({})

删除集合中,所有符合title为 "Titanic"条件的数据

use sample_mflix
db.movies.deleteMany( { title: "Titanic" } )

删除集合中,第一条符合title为 "Titanic"条件的数据

use sample_mflix
db.movies.deleteOne( { title: "Titanic" } )

修改数据

  • To update a single document, use db.collection.updateOne()db.collection.updateOne()

  • To update multiple documents, use db.collection.updateMany()

  • To replace a document, use db.collection.replaceOne()

 【注意】:db.collection.update() 已经被弃用了

字段更新运算符(Field Update Operators)

Name

Description

$currentDate

Sets the value of a field to current date, either as a Date or a Timestamp.

$inc

Increments the value of the field by the specified amount.

$min

Only updates the field if the specified value is less than the existing field value.

$max

Only updates the field if the specified value is greater than the existing field value.

$mul

Multiplies the value of the field by the specified amount.

$rename

Renames a field.

$set

Sets the value of a field in a document.

$setOnInsert

Sets the value of a field if an update results in an insert of a document. Has no effect on update operations that modify existing documents.

$unset

Removes the specified field from a document.

数组更新运算符

Name

Description

$

Acts as a placeholder to update the first element that matches the query condition.

$[]

Acts as a placeholder to update all elements in an array for the documents that match the query condition.

$[<identifier>]

Acts as a placeholder to update all elements that match the arrayFilters condition for the documents that match the query condition.

$addToSet

Adds elements to an array only if they do not already exist in the set.

$pop

Removes the first or last item of an array.

$pull

Removes all array elements that match a specified query.

$push

Adds an item to an array.

$pullAll

Removes all matching values from an array.

查询数据

  • 查询数据,db.collection.find()-- 格式:db.collection.find(query, projection, options)

例子:

插入一条数据

db.movies.insertMany([{"name" : { "first" : 'zhou', "last" : "changping" },"birth" : '2022-09-09',"contribs" : [ 'document', 'help other people' ],"awards" : [{ "award" : 'nobie price', "year": '2030-10-3' }]
},
{"name" : { "first" : 'zhou', "last" : "changping second" },"birth" : '2022-09-09',"contribs" : [ 'build a network', 'help other people' ],"awards" : [{ "award" : 'nobie price', "year": '2030-10-3' }]
}]
)

查询数据,这里使用了点符号方式,查询name.last 为changping的,完全匹配

db.movies.find({'name.last': 'changping'})

  • 查询操作符(query operators )

比较操作符

例子:

插入数据

db.inventory.insertMany( [

{ "item": "Pens", "quantity": 350, "tags": [ "school", "office" ] },

{ "item": "Erasers", "quantity": 15, "tags": [ "school", "home" ] },

{ "item": "Maps", "tags": [ "office", "storage" ] },

{ "item": "Books", "quantity": 5, "tags": [ "school", "storage", "home" ] }

] )

以下查询从集合中选择数量不等于5或15的所有文档。或还匹配没有数量字段的文档。

db.inventory.find( { quantity: { $nin: [ 5, 15 ] } }, { _id: 0 } )

返回结果如下:

{ item: 'Pens', quantity: 350, tags: [ 'school', 'office' ] },

{ item: 'Maps', tags: [ 'office', 'storage' ] }

逻辑操作符

  • 等于: 默认是等于判断, 没有运算符

  • 小于:$lt (less than)

  • 小于等于:$lte (less than equal)

  • 大于:$gt (greater than)

  • 大于等于:$gte

  • 不等于:$ne

  • 属于:$in 匹配数组中指定的任何值

  • 不属于:$nin 返回字段值不属于指定的任何值,或,该字段不存在

  • 与:$and

  • 或:$or

  • 非:$not

  • 既不也不:$nor

其中:

  1. $nor表示的是返回都不匹配组合条件的文档,包括字段不存在。

  1. 格式:

    1. $not格式:{ field: { $not: { <operator-expression> } } }

    2. 其它三个格式:{ <操作符>: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }

  1. 例子:

db.inventory.find( { $nor: [ { 'price': 1.99 }, { 'sale': true } ] } )

解释:此查询将返回以下所有文档:1.两个字段不存在,2. 一个字段不存在,一个不符合条件,3. 两个字段存在,但都不符合条件

db.inventory.find( { $nor: [ { 'price': 1.99 }, { 'price': { $exists: false } },{ 'sale': true }, { 'sale': { $exists: false } } ] } )

解释:此查询将返回以下所有文档:两字段必须存在,但不符合条件的文档

包含price字段但值不等于1.99和包含sale字段但值不等于true

db.inventory.find( { item: { $not: /^p.*/ } } )

db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )

db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )

解释:这三个是一样的查询结果,此查询将返回一下所有文档

  • 包含值不等于1.99的price字段和值不等于true的sale字段,或

  • 包含其值不等于1.99的price字段,但不包含sale字段或

  • 不包含price字段,但包含sale字段其值不等于true或

  • 不包含price字段,也不包含sale字段

  • 包含item字段,但是值不是以p开头或

  • 不包含item字段的

元素操作符

  • 存在否:$exists

  • 类型:$type

    其中:

    1. $exists

    当<boolean>为true时,匹配包含字段的文档,包括字段值为null的文档。

    当<boolean>为false,则查询仅返回不包含该字段的文档

    1. $type 在处理数据类型不可预测的高度非结构化数据时,按数据类型查询非常有用。

权限用户管理

创建用户

创建超级管理用户

use admin
db.createUser({"user":"admin","pwd":"password","roles":["root"]})
成功返回{ok:1}

创建普通用户

use admin
db.createUser({"user":"python","pwd":"python","roles":[{role: "readWrite", db: "admin"}]})db.createUser({"user":"read","pwd":"read","roles":[{role: "readAnyDatabase", db: "admin"}]})

列出所有用户

use admin
db.system.users.find()

列出当前数据库的所有用户

show users

配置文件(/etc/mongod.conf

【注意】:如果想要让权限管理限制生效,就必须配置/etc/mongod.conf文件,设置 security.authorization为enabled才行。

security:authorization: enabled

登录方式

打开mongo shell的时候,输入用户名和密码

mongosh "mongodb://admin:password@localhost:27017/admin"

进入shell时,不输入,进入shell之后使用权限管理

db.auth( "username", "password" )或者
db.auth( "username", passwordPrompt() )

删除用户

db.runCommand({dropUser: "<user>",writeConcern: { <write concern> },comment: <any>}
)

已经存在的用户添加新权限grantRolesToUser

语法格式

db.runCommand({grantRolesToUser: "<user>",roles: [ <roles> ],writeConcern: { <write concern> },comment: <any>}
)

例子:

假如原始用户python的权限如下

  {_id: 'admin.python',userId: new UUID("ccae0784-7376-4817-8aba-9918ad38d615"),user: 'python',db: 'admin',roles: [ { role: 'read', db: 'dbname' } ],mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]}

修改权限

db.runCommand({grantRolesToUser: "python", roles: [{role:"read", db:"dbname"}, "readWrite"]})

修改后结果如下:

  {_id: 'admin.python',userId: new UUID("ccae0784-7376-4817-8aba-9918ad38d615"),user: 'python',db: 'admin',roles: [{ role: 'read', db: 'dbname' },{ role: 'readWrite', db: 'admin' }],mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]}

以下是权限开启后,通过python用户更新dbname数据库时,就会报权限不足的错误,因为从上面可知,python用户对dbname数据库只有只读权限。

MongoDB Python Drivers

mongoDB操作-持续更新中...相关推荐

  1. linux 查看工程用什么工具,工程师工具包-Linux常用命令及常用操作-持续更新中...

    Linux系统命令相关 系统相关 date date 查看系统时间 $date 2017年 09月 18日 星期一 18:01:06 CST date -R查看系统时间,并且在时间后面加上时区的显示 ...

  2. [python]队列操作(持续更新中)

    Ctrl+f搜关键词,搜不到找其他博客,下面肯定没有 队列 队列要实现的操作 Queue() 创建一个空的队列 is_empty() 判断一个队列是否为空 length() push(item) 添加 ...

  3. Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...)

    Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 目录 Android Studio 的一些 常用操作和 编译报错 整理(持续更新中...) 一.Android s ...

  4. 【Vue全家桶+SSR+Koa2全栈开发】项目搭建过程 整合 学习目录(持续更新中)

    写在开头 大家好,这里是lionLoveVue,基础知识决定了编程思维,学如逆水行舟,不进则退.金三银四,为了面试也还在慢慢积累知识,Github上面可以直接查看所有前端知识点梳理,github传送门 ...

  5. 【Spring Boot官方文档原文理解翻译-持续更新中】

    [Spring Boot官方文档原文理解翻译-持续更新中] 文章目录 [Spring Boot官方文档原文理解翻译-持续更新中] Chapter 4. Getting Started 4.1. Int ...

  6. 前端知识点总结——JS高级(持续更新中)

    前端知识点总结--JS高级(持续更新中) 1.字符串 什么是: 连续存储多个字符的字符数组 相同: 1. 下标 2. .length 3. 遍历 4. 选取: slice(starti[, endi] ...

  7. 【docker常用镜像命令总结,持续更新中... 建议收藏!】

    1.reids redis的启动命令 docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data -v /mydata/redis ...

  8. 阿里最新面试必备项之Java的String类,持续更新中!

    最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...

  9. ptaa乘以b_PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)...

    C++ CPP C++语言开发 PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中--) PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:     ...

  10. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

最新文章

  1. Diomidis Spinellis:有效的调试
  2. ibtmp1文件过大
  3. 使用Prometheus和Grafana实现SLO
  4. java登录界面命令_Java命令行界面(第15部分):Jargo
  5. c语言逆序输出6A8F,【C语言】将二进制数逆序输出。比如6为000...0110,逆序后为0110....
  6. Redis分布式锁及分区
  7. Unity3D之UGUI基础2:Text文本
  8. 面向对象基本特性和设计原则
  9. 企业级AD域管理部署实战 微软升级版MCSE MCSA必修课程 Windows Server 2016AD管理实战
  10. smtp服务器发送邮件的工作原理,SMTP协议工作原理及服务.doc
  11. 在网易游戏的第三年——Jerish的2021总结
  12. Android实战之 上传头像 和仿QQ空间、微博发表文字和图片
  13. [转载]唐僧的亲爹究竟是谁 (2016-02-17 16:37:21)
  14. Android4.1
  15. 累加数Python解法
  16. 提升树(Boosting tree)算法总结
  17. 计算机中 8位无符号数,8位无符号数乘法运算HDL设计实例 - 全文
  18. c语言矢量字体库,单片机用矢量字库的C语言调用
  19. PHP7的异常处理机制,set_error_handler和set_exception_handler方法介绍
  20. 保险行业数据分析(案例)

热门文章

  1. 使用app管理家庭路由器(TP-Link,水星,腾达等)
  2. Get busy living--or get busy dying
  3. 【英语魔法俱乐部——读书笔记】 1 初级句型-简单句(Simple Sentences)
  4. 文字跳跃率与图片跳跃率
  5. Java中的Set、Map(二叉搜索树篇)
  6. 2021年机修钳工(中级)考试资料及机修钳工(中级)新版试题
  7. 基于微信小程序的基于安卓APP的设计毕设计ADD ME let me help you
  8. 亚马逊服务器运行软件,如何在亚马逊的EC2上运行Java服务器?
  9. 冷色系清新调、日系清新调 、电影色调复古风、欧美风复古,用曲线就可以调了!!!...
  10. 景深决定照相机什么特性_相机的景深是什么