[mongo入门日记]

2024-08-30 17:44
文章标签 入门 日记 mongo

本文主要是介绍[mongo入门日记],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024-8-30

authSource是什么?

`authSource` 是 MongoDB 连接字符串中的一个参数,用于指定**认证数据库**(authentication database)。认证数据库是 MongoDB 用来存储用户凭据(用户名和密码)以及权限信息的数据库。当客户端连接到 MongoDB 时,它使用这个数据库来验证用户的身份和权限。

### **为什么需要 `authSource`?**

- 在 MongoDB 中,用户是与一个特定的数据库关联的。该数据库被称为用户的**认证数据库**。
- 当一个用户登录时,MongoDB 会在这个认证数据库中查找用户的凭据信息。
- 如果连接字符串中不指定 `authSource`,MongoDB 会默认在所连接的数据库(即连接字符串中的 `dbname`)中进行认证。

### **什么时候使用 `authSource`?**

1. **用户创建在 `admin` 数据库中:**
   - 默认情况下,大多数管理员用户是在 `admin` 数据库上创建的。
   - 如果你需要连接到其他数据库但使用 `admin` 数据库中的用户进行认证,必须指定 `authSource=admin`。
   - 示例:
     ```go
     mongodb://username:password@host:port/myDatabase?authSource=admin
     ```
   - 这里,MongoDB 会在 `admin` 数据库中查找 `username` 的凭据,然后授权连接和操作 `myDatabase`。

2. **用户创建在非默认数据库:**
   - 如果你的用户是在特定的数据库(例如 `userDB`)中创建的,而不是 `admin`,则需要在连接字符串中指定该数据库为 `authSource`。
   - 示例:
     ```go
     mongodb://username:password@host:port/myDatabase?authSource=userDB
     ```
   - 这会告诉 MongoDB,在 `userDB` 数据库中查找用户凭据,而不在 `myDatabase`(默认数据库)中查找。

### **默认行为**

- 如果未指定 `authSource` 参数,MongoDB 将假设认证数据库是连接字符串中的 `dbname`。
- 例如,如果连接字符串是:
  ```go
  mongodb://username:password@host:port/myDatabase
  ```
  MongoDB 会在 `myDatabase` 数据库中寻找用户 `username` 的凭据。

### **总结**

- `authSource` 指定了 MongoDB 用于认证用户的数据库。
- 如果用户不在连接的数据库中创建,或者用户在 `admin` 数据库中创建但需要访问其他数据库,则必须使用 `authSource` 参数来指定正确的认证数据库。

replaceOne:

一个常见的错误是查询条件匹配到了多个文档,然后更新时由第二个参数产生了重复的 "_id" 值。数据库会抛出错误,任何文档都不会被更新。

updateOne:

使用更新运算符时,"_id" 的值是不能改变的。(注意,整个文档替换时是可以
改变 "_id" 的。)其他键值,包括其他唯一索引的键,都是可以更改的。

Todo:

应该始终使用 $ 修饰符来增加、修改或删除键。常见的错误做法是把键的值通过更新设置成其他值,如以下操作所示:
> db.blog.posts.updateOne({"author.name" : "joe"},... {"author.name" : "joe schmoe"})

这会事与愿违。更新的文档必须包含更新运算符。之前版本的 CRUD API 无法捕捉这种类型的错误。早期的更新方法在这种情况下会简单地进行整个文档的替换。正是这种缺陷促成了新 CRUD API 的诞生。

Todo:$ne 和$addToSet的区别

"$inc" 只能用于整型、长整型或双精度浮点型的值。如果用在其他任何类型(包括很多语言中会被自动转换为数值的类型,比如 null、布尔类型以及数字构成的字符串)的值上,则会导致操作失败:
> db.strcounts.insert({"count" : "1"})
WriteResult({ "nInserted" : 1 })> db.strcounts.update({}, {"$inc" : {"
count" : 1}})WriteResult({  "nMatched" : 0,

"nUpserted" : 0,  "nModified" : 0,  "writeError" : {    "code" : 16837,    "errmsg" : "Cannot apply $inc to a
 value of non-numeric type.    {_id: ObjectId('5726c0d36855a935cb
57a659')} has the field 'count' of    non-numeric type String"  }})

同样,"$inc" 键的值必须为数字类型。不能使用字符串、数组或者其他非数字类型的值。否则会提示错误信息:“Modifier "$inc" allowed for numbers only”。如果需要修改其他类型的值,可以使用 "$set" 或者下面要讲到的数组运算符。

> db.movies.updateOne({"genre" : "horror"},
... {"$push" : {"top10" : {"$each" : [{"nam
e" : "Nightmare on Elm Street",...                                    "rat
ing" : 6.6},...                                   {"nam
e" : "Saw", "rating" : 4.3}],...                        "$slice" : -10,...                        "$sort" : {"rati
ng" : -1}}}})
这样会根据 "rating" 字段的值对数组中的所有对象进行排序,然后保留前 10 个。注意,不能只将 "$slice" 或"$sort" 与 "$push" 配合使用,必须包含 "$each"。

数组运算符只能用于包含数组值的键。例如,不能将元素插入一个整数中,也不能从一个字符串中弹出元素。请使用 "$set" 或 "$inc" 来修改标量值。

不过,在很多情况下,如果不预先查询文档并进行检查,就不知道要修改数组的下标。为了解决这个问题,MongoDB 提供了一个定位运算符 $,它可以计算出查询文档匹配的数组元素并更新该元素。如果有一个名为 John的用户将其名字改为了 Jim,那么可以使用定位运算符在评论中进行替换:
> db.blog.updateOne({"comments.author" : "John"},... {"$set" : {"comments.$.author" : "Jim"}})
定位运算符只会更新第一个匹配到的元素。因此,如果John 发表了多条评论,那么他的名字只会在第一条评论中被改变。

使用数组过滤器进行更新

MongoDB 3.6 引入了另一个用于更新单个数组元素的选项:arrayFilters。此选项使我们能够修改与特定条件匹配的数组元素。如果想隐藏所有拥有 5 个或以上反对的评论,那么可以执行以下操作:
db.blog.updateOne(
    {"post" : post
_id },    { $set: { "com
ments.$[elem].hidden" : t
rue } },    {      arrayFilters
: [ { "elem.votes": { $lt
e: -5 } }]    })
这个语句将 elem 定义为了 "comments" 数组中每个匹配元素的标识符。如果 elem 所标识的评论的 votes 值小于或等于 -5,那么就在 "comments" 文档中添加一个名为 "hidden" 的字段,并将其值设置为 true。

upsert:

upsert 是一种特殊类型的更新。如果找不到与筛选条件相匹配的文档,则会以这个条件和更新文档为基础来创建一个新文档;如果找到了匹配的文档,则进行正常的更新。upsert 用起来非常方便,有了它便不再需要“预置”集合:通常可以使用同一套代码创建和更新文档。

2024-8-1

stOnInsert:

有时候需要在创建文档时对字段进行设置,但在后续更新时不对其进行更改。这就是 "$setOnInsert" 的作用。"$setOnInsert" 是一个运算符,它只会在插入文档时设置字段的值。因此,可以像下面这样做:

save 辅助函数
save 是一个 shell 函数,它可以在文档不存在时插入文档,在文档存在时更新文档

findOneAndDelete、findOneAndReplace 和findOneAndUpdate

他们是原子操作。

find查询

"$lt"、"$lte"、"$gt" 和 "$gte" 都属于比较运算符,分别对应 <、<=、> 和 >=。可以将它们组合使用以查找一个范围内的值。例如,要查询 18 到 30 岁的用户,可以进行如下操作:
> db.users.find({"age" : {"$gte" : 18, "$lte" : 30}})

对于文档键值不等于某个特定值的情况,就要使用另外一种条件运算符 "$ne" 了,它表示“不相等”。如果想找到所有用户名不为 joe 的用户,可以像下面这样查询:
> db.users.find({"username" : {"$ne" : "joe"}})
"$ne" 可以用于任何类型的数据。

这篇关于[mongo入门日记]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121503

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能

《POI从入门到实战轻松完成EasyExcel使用及Excel导入导出功能》ApachePOI是一个流行的Java库,用于处理MicrosoftOffice格式文件,提供丰富API来创建、读取和修改O... 目录前言:Apache POIEasyPoiEasyExcel一、EasyExcel1.1、核心特性

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP