[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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

MySQL入门到精通

一、创建数据库 CREATE DATABASE 数据库名称; 如果数据库存在,则会提示报错。 二、选择数据库 USE 数据库名称; 三、创建数据表 CREATE TABLE 数据表名称; 四、MySQL数据类型 MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型 4.1 数值类型 数值类型 类型大小用途INT4Bytes整数值FLOAT4By

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是