首页 > 数据库 >个人技能总结-mongodb部分

个人技能总结-mongodb部分

时间:2024-08-13 14:16:21浏览次数:14  
标签:总结 name dbabd mongodb db admin user 分片 技能

mongodb集群部分技能总结
mongodb集群架构
MongoDB是一种广泛使用的NoSQL数据库,其集群架构设计灵活且强大,能够根据不同的应用场景和需求提供合适的解决方案。目前,MongoDB主要有三种集群架构模式:主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。
主从复制(Master-Slaver)
主从复制模式是一种早期的集群架构,其中包含一个主节点和多个从节点。主节点负责处理客户端请求、读写数据,并记录所有操作日志;从节点则用于备份数据,当主节点发生故障时可以进行故障恢复。然而,由于这种模式缺乏高可用性和容错能力,官方已经不推荐使用。
副本集(Replica Set)
副本集模式是MongoDB中较为推荐的一种集群架构。它通过在多个节点上复制数据来提高数据的可靠性和可用性。每个副本集包含一个Primary节点和多个Secondary节点。Primary节点负责写入操作,而Secondary节点则用于读取操作。当Primary节点发生故障时,副本集会自动选举一个新的Primary节点,并引导其他Secondary节点连接到新的Primary节点,整个过程对应用是透明的。
分片(Sharding)
分片模式适用于处理大规模数据集。分片集群将数据分布在多个服务器上,每个服务器上的数据块称为Shard。分片集群由三个主要组件组成:Shard、配置服务器(Config Server)和路由服务器(mongos)。Shard是实际存储数据的地方,配置服务器存储集群的元数据,而mongos作为查询路由器,负责将客户端请求分发到正确的Shard上。
总结
MongoDB提供了多种集群架构模式以满足不同场景的需求:
主从复制:虽然不再推荐,但仍然可以用于简单的备份和故障恢复。
副本集:提供高可用性和容错能力,是目前最广泛使用的集群架构。
分片:适用于处理大规模数据集,通过分布式存储提高性能和扩展性。
选择合适的集群架构可以根据具体的应用需求和数据量来决定
MongoDB容量规划
MongoDB容量规划是一个复杂且多方面的过程,需要综合考虑数据增长速度、数据库结构、读写比例和硬件选择等多个因素。以下是一些关键要点:
数据增长速度:首先,需要预估数据的增长速度。例如,如果每天新增100万条记录,那么在3个月后将会有大约3000万条记录。这种预估有助于确定所需的存储容量。
数据库结构:合理的数据库设计可以显著影响性能和存储需求。例如,通过优化索引和存储结构,可以提高查询效率并减少不必要的存储空间占用。
读写比例:不同的应用场景对读写操作的需求不同。通常情况下,MongoDB的读操作会比写操作更频繁,因此在容量规划时应特别关注读取性能。
硬件选择:内存和硬盘是影响MongoDB性能的重要硬件资源。一般建议将所有热数据(即经常访问的数据、索引和系统开销)放在内存中,以确保高性能。此外,还需要根据实际需求选择合适的存储引擎,如WiredTiger或MMAPv1,因为它们在性能、并发控制和压缩方面各有优劣。
分片策略:对于大数据集或高吞吐量的应用,可以采用分片(sharding)策略来水平扩展数据库。分片可以通过范围分片或哈希分片实现,具体选择取决于数据分布和访问模式。
持续监控和优化:在部署完成后,持续监控数据库的性能和资源使用情况是非常重要的。通过实时监控,可以及时发现潜在问题并进行调整,从而保持系统的高效运行。
存储瘦身:为了降低磁盘占用率,可以采用存储瘦身技术,如数据压缩和删除不再需要的数据。但需要注意的是,瘦身操作可能会带来额外的IO压力,从而影响数据库性能。
总之,MongoDB容量规划需要从多个角度出发,结合具体应用场景进行详细分析和计算。通过合理的规划和持续优化,可以确保MongoDB在满足业务需求的同时,具有良好的性能和可用性
MongoDB配置详解
MongoDB WiredTiger配置说明
MongoDB的WiredTiger存储引擎是自3.0版本引入并从3.2版本开始成为默认的存储引擎。该引擎通过优化内存和磁盘使用,显著提升了MongoDB的性能和稳定性。以下是关于WiredTiger配置的一些关键说明:

  1. 设置WiredTiger的cacheSizeGB
    WiredTiger引擎可以设置其内部缓存的最大内存使用量,这个值可以通过--wiredTigerCacheSizeGB参数来指定。默认情况下,这个值是系统可用内存的60%左右。例如,在一个总共有4GB RAM的系统上,WiredTiger缓存将使用1.5GB的RAM(0.5 * (4 GB - 1 GB) = 1.5 GB)。
  2. 检查点(Checkpoint)
    从MongoDB 3.6版本开始,WiredTiger每60秒创建一次检查点,即将快照数据写入磁盘。在早期版本中,检查点的触发条件是每60秒或当日志文件达到2GB时。
  3. 启用Log Rotation
    为了防止日志文件过大导致性能问题,建议启用Log Rotation功能,这样可以确保日志文件不会占用过多的磁盘空间。
  4. 使用SSD或RAID10
    为了进一步提升性能,推荐使用SSD硬盘或者RAID10配置,这可以显著提高读写速度和数据可靠性。
  5. 其他优化措施
    分配足够的Oplog空间:确保Oplog有足够的空间以应对高并发写入操作。
    压缩&加密:对于需要高安全性和压缩比的应用场景,可以考虑启用数据压缩和加密功能。
    文档级并发控制:WiredTiger支持文档级并发控制,可以在多用户环境下提供更好的性能表现。
    配置示例
    在启动MongoDB时,可以通过以下命令指定WiredTiger的配置:
    mongod --storageEngine wiredTiger --dbpath /path/to/wt-data --wiredTigerCacheSizeGB=10
    这里--wiredTigerCacheSizeGB=10表示将WiredTiger缓存大小设置为10GB。
    通过以上配置和优化,可以有效提升MongoDB在使用WiredTiger存储引擎时的性能和稳定性。
    MongoDB配置文件说明

mongodb.conf

数据库文件位置

dbpath=/var/lib/mongodb

日志文件的路径

logpath=/var/log/mongodb/mongodb.log

是否追加方式写入日志,默认True

logappend=true

设置绑定ip

bind_ip = 127.0.0.1

设置端口

port = 27017

是否以守护进程方式运行,默认false

fork = true

启用日志文件,默认启用

journal=true

启用定期记录CPU利用率和 I/O 等待,默认false

cpu = true

是否以安全认证方式运行,默认是不认证的非安全方式

noauth = true

auth = true

详细记录输出,默认false

verbose = true

用于开发驱动程序时验证客户端请求

objcheck = true

# 启用数据库配额管理,默认false

quota = true

设置oplog日志记录等级,默认0

0=off (default)

1=W

2=R

3=both

7=W+some reads

oplog = 0

是否打开动态调试项,默认false

nocursors = true

忽略查询提示,默认false

nohints = true

禁用http界面,默认为localhost:28017

nohttpinterface = true

关闭服务器端脚本,这将极大的限制功能,默认false

noscripting = true

关闭扫描表,任何查询将会是扫描失败

notablescan = true

关闭数据文件预分配

noprealloc = true

为新数据库指定.ns文件的大小,单位:MB

nssize =

用于Mongo监控服务器的Accout token。

mms-token =

Mongo监控服务器的服务器名称。

mms-name =

Mongo监控服务器的Ping间隔时间,即心跳

mms-interval =

Replication Options

设置主从复制参数

slave = true # 设置从节点

source = master.example.com # 指定从节点的主节点

Slave only: 指定要复制的单个数据库

only = master.example.com

or

master = true # 设置主节点

source = slave.example.com

设置副本集的名字,所有的实例指定相同的名字属于一个副本集

replSet = name

pairwith = server:port

仲裁服务器地址

arbiter = server:port

默认为false,用于从实例设置。是否自动重新同步

autoresync = true

指定的复制操作日志(OPLOG)的最大大小

oplogSize =

限制复制操作的内存使用

opIdMem =

设置ssl认证

Enable SSL on normal ports

sslOnNormalPorts = true

SSL Key file and password

sslPEMKeyFile = /etc/ssl/mongodb.pem

sslPEMKeyPassword = pass

MongoDB运维常用命令总结
1.1 用户管理
 查看角色
// 查询当前数据库中的角色权限

db.runCommand({ rolesInfo: "" })

// 查询其它数据库中指定的角色权限

db.runCommand({ rolesInfo: { role: "", db: "" } }

// 查询多个角色权限

db.runCommand(
{
rolesInfo: [
"",
{ role: "", db: "" },
...
]
}
)

// 查询所有角色权限(仅用户自定义角色)

db.runCommand({ rolesInfo: 1 })
// 查询所有角色权限(包含内置角色)
db.runCommand({ rolesInfo: 1, showBuiltinRoles: true })
 角色权限控制
Mongodb内置角色说明

Mongodb自定义角色
在admin数据库中创建自定义角色dbabd,对集合city有find,update权限,对集合user_operation只有find权限。

db.createRole(
{
role: "dbabd",
privileges: [
{ resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["find"] },
],
roles: []
}
)

db.adminCommand(
{
createRole: "dbabd",
privileges: [
{ resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["find"] }
],
roles: [ ]
}
)
更新自定义角色
db.updateRole(
"dbabd",
{
privileges: [
{ resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["find", "insert"] }
],
roles: []
}
)

db.adminCommand(
{
updateRole: "dbabd",
privileges: [
{ resource: { db: "dbabd", collection: "city" }, actions: ["find", "update"] },
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["find", "insert"] }
],
roles: []
}
)
添加角色权限
为自定义角色dbabd添加集合dbabd.user_operation的remove权限。
db.grantPrivilegesToRole(
"dbabd",
[
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["remove"] }
]
)

use admin
db.runCommand(
{
grantPrivilegesToRole: "dbabd",
privileges: [
{ resource: { db: "dbabd", collection: "user_operation" }, actions: ["remove"] }
]
}
)
删除角色权限
为自定义角色dbabd收回集合dbabd.city的update权限。
db.revokePrivilegesFromRole(
"dbabd",
[
{ resource: { db: "dbabd", collection: "city" }, actions: ["update"] }
]
)

use admin
db.runCommand(
{
revokePrivilegesFromRole: "dbabd",
privileges: [
{ resource: { db: "dbabd", collection: "city" }, actions: ["update"] }
]
}
)
添加角色继承的角色
为自定义角色dbabd添加dbabd数据库的read角色,继承其角色权限。
use dbabd
db.grantRolesToRole("dbabd", [{ role: "read", db: "dbabd" }])

use dbabd
db.runCommand({ grantRolesToRole: "dbabd", roles: [{ role: "read", db: "dbabd" }] })

// 查询角色信息验证

db.getRole("dbabd")
{
"role" : "dbabd",
"db" : "admin",
"isBuiltin" : false,
"roles" : [
{
"role" : "read",
"db" : "dbabd"
}
],
"inheritedRoles" : [
{
"role" : "read",
"db" : "dbabd"
}
]
}
删除角色继承的角色
为自定义角色dbabd收回dbabd数据库的read角色及其角色权限。
use dbabd
db.revokeRolesFromRole("dbabd", [{ role: "read", db: "dbabd" }])

use dbabd
db.runCommand({ revokeRolesFromRole: "dbabd", roles: [{ role: "read", db: "dbabd" }] })
//查询角色信息验证
db.getRole("dbabd")
{
"role" : "dbabd",
"db" : "admin",
"isBuiltin" : false,
"roles" : [ ],
"inheritedRoles" : [ ]
}
删除自定义角色
use admin
db.dropRole("dbabd")

use admin
db.runCommand({ dropRole: "dbabd" })
用户创建
MongoDB是基于角色的访问控制,所以创建用户需要指定用户的角色,在创建用户之前需要满足:
先在admin数据库中创建角色为userAdmin或userAdminAnyDatabase的用户作为管理用户的用户;
启用访问控制,进行登录用户验证,这样创建用户才有意义。
启用访问控制登录之前,首先需要在admin数据库中创建角色为userAdmin或userAdminAnyDatabase作为用户管理的用户,之后才能通过这个用户创建其它角色的用户,这个用户作为其它所有用户的管理者。
// 创建管理用户用户名为user_admin,密码admin
db.createUser(
{
user: "user_admin",
pwd: "admin",
roles: [{ role: "userAdminAnyDatabase", db: "admin" }]
}
)
//输出结果:
Successfully added user: {
"user" : "user_admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
开启访问控制
要开启访问控制,则需要在mongod进程启动时加上选项--auth或在启动配置文件加入选项auth=true,并重启mongodb实例。

mongod配置文件如下

cat mongodb.cnf

journal=true
dbpath=/data/mongodb/4.0/data
directoryperdb=true
fork=true
port=27017
logpath=/data/mongodb/4.0/logs/mongodb.log
quiet=true
bind_ip_all=true
auth=true
用户管理用户验证
可以在使用mongo shell登录时添加选项--authenticationDatabase或登录完后在admin数据库下进行验证。
在mongo shell登录时同时进行验证:

mongo 192.168.58.2:27017 -uuser_admin -p --authenticationDatabase admin

MongoDB shell version v4.0.9
Enter password: # 输入密码admin
用户管理操作
使用user_admin用户在admin数据库中创建基于角色dbabd的用户dbabd_user,密码为dbabd。

use admin
db.createUser(
{
user: "dbabd_user",
pwd: "dbabd",
roles: ["dbabd"],
customData: { info: "user for dbabd" }
}
)
查看用户信息
use admin
db.getUser("dbabd_user", { showPrivileges: true })
为用户添加角色
用户dbabd_user添加admin数据库的readWrite角色。
use admin
db.grantRolesToUser(
"dbabd_user",
[
{ role: "readWrite", db: "admin" },
{ role: "dbabd", db: "admin" }
]
)
更新用户信息
更新用户dbabd_user具有admin数据库readWrite角色为read角色。
use admin
db.updateUser(
"dbabd_user",
{
customData: { info: "user for dbabd" },
roles: [
{ role: "dbabd", db: "admin" },
{ role: "read", db: "admin" }
]
}
)
为用户回收角色
用户dbabd_user回收admin数据库的read角色。
use admin
db.revokeRolesFromUser(
"dbabd_user",
[
{ role: "read", db: "admin" }
]
)
更改用户密码
更改用户dbabd_user密码为dbabdnew。
use admin
db.changeUserPassword("dbabd_user", "dbabdnew")
删除用户
use admin
db.dropUser("dbabd_user")
1.2 mongodb shard相关

查看副本集状态

rs.status();
添加shard复制集
db.runCommand({addshard:
"yidian_repl/192.168.230.128:27017,192.168.230.129:27017,192.168.230.130:27017",name:"shard1"});
删除shard复制集
db.runCommand({removeShard:"shard2"});
查询分片列表
db.runCommand({listshards:1});
db.runCommand({enablesharding:"testdb"});
或者
sh.enableSharding("")
对集合设置数据分片
db.runCommand({shardcollection:"db.collection",key:{field1:1}}); // 需要切换到admin库,再执行相关命令
或者
db.adminCommand({shardcollection:"db.collection",key:{field1:1}}) // 无需切换到admin库,直接执行admin库中的命令
或者
sh.shardCollection(".",{ "": } ) // 需要切换到admin库,再执行相关命令
db:数据库名。
collection:集合名。
key:分片的键,MongoDB将根据片键的值进行数据分片。
field1:集合的字段
1:表示基于范围分片,通常能很好地支持基于片键的范围查询。
“hashed”:表示基于哈希分片,通常能将写入均衡分布到各Shard节点中。
示例:
基于范围分片的配置示例:
sh.shardCollection(“mongodbtest.customer”,{“field1”:1})
基于哈希分片的配置示例:
sh.shardCollection(“mongodbtest.customer”,{“field1”:“hashed”})
查询集合分片统计
db.collectionName.stats();
查看分片数据分布
use dbnamedb.colletionName.getShardDistribution() #可以查看数据分布
初始化shard
rs.initiate(
{
_id: "myReplSet",
version: 1,
members: [
{ _id: 0, host : "mongodb0.example.net:27017" },
{ _id: 1, host : "mongodb1.example.net:27017" },
{ _id: 2, host : "mongodb2.example.net:27017" }
]
}
)
1.3 mongodb sh相关
sh.addShard()
将分片副本集添加到分片集群。此方法必须在mongos实例上运行。
sh.disableBalancing(名称空间)
禁用指定分片集合的平衡器。这不会影响同一集群中其他分片集合的块平衡 。
sh.enableBalancing(名称空间)
为分片集合的指定名称空间启用平衡器
sh.enableSharding(database,primaryShard )
在指定的数据库上启用分片。为数据库启用分片后,即可用于sh.shardCollection() 在该数据库中分片集合。的mongo 壳的方法sh.enableSharding()包装了 enableSharding命令。
sh.isBalancerRunning()
如果平衡器进程当前正在运行并且正在迁移块,则返回true;如果平衡器进程未运行,则返回false。使用sh.getBalancerState()以确定平衡器启用或禁用。
sh.moveChunk(名称空间,查询,目标)
将包含所指定文档 的块移动query到分片destination。sh.moveChunk() 提供围绕moveChunk数据库命令的包装,并采用以下参数:
namespace 串 分片集合的名称空间,其中包含要迁移的块。
query 文献 分片键上的相等匹配项,用于选择要移动的块。
destination 串 要移动的分片的名称。
sh.moveChunk("records.people", { zipcode: "53187" }, "shard0019")
sh.status()
在mongos实例上运行时,打印分片配置的格式化报告以及有关分片集群中现有块的信息。如果块的总数大于或等于20,则默认行为将禁止显示详细的块信息
1.4 Mongodb db相关
查看所有的数据库
show dbs
查看一个数据库所有的表
show collection
查看用户
show users
show profile;
查看主机的名称
hostname();
查看当前目录
pwd();
查看数据库相关的帮助:
db.help();
查看mongo数据库当前数据库服务器状态
db.serverStatus();
查看当前数据库名称:
db.getName();
查看当前版本
db.version();
查看数据库表的情况
db.getCollectionNames();
查看数据库是否存在一个表
db.getCollection("Feed");
是否为主数据库
db.isMaster();
数据库的情况
db.stats();
关闭数据库
use admin
db.shutdownServer();
获取当前连接的对象
db.getMongo()
删除Mongo数据库
db.dropDatabase();
创建一个Mongo表对象
db.createCollection("TBS");
删除数据的表对象
db.mash5.drop();
显示当前数据库的操作
db.currentOp();
查看所有的数据库命令:
db.listCommands();
分页查询
db.Feed.find().skip(300).limit(10000);
单个条件查询
db.Task.find({ "tag" : "个人" }).limit(50);
多个条件查询
db.Task.find({ "tag" : "个人", "_id" : ObjectId("4e169d85cc4370e29bc6c72e") }).limit(50).explain();
根据结构型查询
db.Task.find({ "bo.Fields.Label" : "私信" }).limit(50).explain();
db.Task.find({"status":"1"}).count();
db.Task.findOne({"status":"1"});
条件
db.collection.find({"field":{gt:value}}); db.collection.find({"field":{lt:value}});
db.collection.find({"field":{gte:value}}); db.collection.find({"field":{lte:value}});
范围段
db.collection.find({"field":{ lt:value2}});
all匹配所有:
db.users.find({age:{all:[6,7,8]}});
exists判断字段是否存在
db.users.find({age:{exists:true}});
不存在
db.users.find({age:{$exists:false}});
null的处理
db.things.find({y:null});
查询包含null的对象
db.things.find({age:{"in":[null],"exists":true}});
1.5 MongoDB增删改查
和mysql对应关系如下:
MySQL MongoDB
CREATE TABLE USERS(a Number, b Number) db.users
INSERT INTO USERS VALUES(1, 1) db.users.insert({'a':1, 'b':1})
SELECT a, b FROM USERS db.users.find({}, {'a';1, 'b':1})
SELECT * FROM USERS db.users.find()
SELECT a, b FROM USERS WHERE age=33 and name='Jack' db.users.find({'age':33, 'name':'Jack'}, {'a';1, 'b':1})
SELECT * FROM USERS WHERE age=33 ORDER BY name db.users.find({'age':33}).sort({'name': 1})
SELECT * FROM USERS WHERE age>33 db.users.find({'age':{'$gt':33}})
SELECT * FROM USERS WHERE age<33 db.users.find({'age':{'$lt':33}})
SELECT * FROM USERS WHERE name LIKE '%Jack%' db.users.find({'name': '/Jack/'})
SELECT * FROM USERS WHERE name LIKE 'Jack%' db.users.find({'name': '/^Jack/'})
SELECT * FROM USERS WHERE age>33 AND age < 40 db.users.find({'age':{'$gt':33, '$lt':40}})
SELECT * FROM USERS ORDER BY name DESC db.users.find().sort({'name': -1})
SELECT * FROM USERS LIMIT 1 db.users.findOne()
SELECT * FROM USERS LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
SELECT * FROM USERS WHERE age=33 or name='Jack' db.users.find({'$or:[{'age':33}, {'name':'Jack'}]})
SELECT DISTINCT last_name FROM USERS db.users.distinct('last_name')
SELECT COUNT() FROM USERS db.users.count()
SELECT COUNT(
) FROM USERS WHERE age=33 db.users.find({'age':33}).count()
UPDATE USERS SET name='LEE' WHERE age=33 db.user.update({'age':33}, {'$set':{'name':'LEE',}} false, true)
UPDATE USERS SET age=age+10 WHERE name='LEE' db.user.update({'name':'LEE'}, {'$inc':{'age':10}}, false, true)
CREATE INDEX myindex ON users(name) db.user.ensureIndex({'name':1})
CREATE INDEX myindex ON users(name, ts DESC) db.user.ensureIndex({'name':1, 'ts':-1})
DELETE FROM USERS WHERE name='Alex' db.users.remove({'name':'Alex'})

排序:$sort、限制:$limit、跳过:$skip
{"$sort":{"字段名":1,"字段名":-1}} #1升序,-1降序
{"$limit":n}
{"$skip":n} #跳过多少个文档

例1、取平均工资最高的前两个部门

db.emp.aggregate(
{
"$group":{"_id":"$post","平均工资":{"$avg":"$salary"}}
},
{
"$sort":{"平均工资":-1}
},
{
"$limit":2
}
)

例2、

db.emp.aggregate(
{
"$group":{"_id":"$post","平均工资":{"$avg":"$salary"}}
},
{
"$sort":{"平均工资":-1}
},
{
"$limit":2
},
{
"$skip":1
}
)
表达式

1、表达式之数学表达式

{"$add":[expr1,expr2,...,exprN]} #相加
{"$subtract":[expr1,expr2]} #第一个减第二个
{"$multiply":[expr1,expr2,...,exprN]} #相乘
{"$divide":[expr1,expr2]} #第一个表达式除以第二个表达式的商作为结果
{"$mod":[expr1,expr2]} #第一个表达式除以第二个表达式得到的余数作为结果

2、表达式之日期表达式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second

例如:select name,date_format("%Y") as hire_year from db1.emp

db.emp.aggregate(
{"$project":{"name":1,"hire_year":{"$year":"$hire_date"}}}
)

例如查看每个员工的工作多长时间

db.emp.aggregate(
{"$project":{"name":1,"hire_period":{
"$subtract":[
{"$year":new Date()},
{"$year":"$hire_date"}
]
}}}
)

3、字符串表达式

{"$substr":[字符串/$值为字符串的字段名,起始位置,截取几个字节]}
{"$concat":[expr1,expr2,...,exprN]} #指定的表达式或字符串连接在一起返回,只支持字符串拼接
{"$toLower":expr}
{"$toUpper":expr}
db.emp.aggregate( {"$project":{"NAME":{"$toUpper":"$name"}}})
$match和 $group:相当于sql语句中的where和group by
{"$match":{"字段":"条件"}},可以使用任何常用查询操作符$gt,$lt,$in等

例1、select * from db1.emp where post='公务员';

db.emp.aggregate({"$match":{"post":"公务员"}})

例2、select * from db1.emp where id > 3 group by post;

db.emp.aggregate(
{"$match":{"_id":{"$gt":3}}},
{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}}
)

例3、select * from db1.emp where id > 3 group by post having avg(salary) > 10000;

db.emp.aggregate(
{"$match":{"_id":{"$gt":3}}},
{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}},
{"$match":{"avg_salary":{"$gt":10000}}}
)
避免重复添加 $addToSet 即多个相同元素要求插入时只插入一条
db.urls.insert({"_id":1,"urls":[]})
db.urls.update(
{"_id":1},
{
"$addToSet":{
"urls":{
"$each":[
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.xxxx.com'
]
}
}
}
)
添加删除数组内元祖$push $pop $pull

1、为名字为武大郎的人添加一个爱好read

db.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})

2、为名字为武大郎的人一次添加多个爱好tea,dancing

db.user.update({"name":"武大郎"},{"$push":{
"hobbies":{"$each":["tea","dancing"]}
}})
加减操作:$inc

增加和减少$inc

年龄都+1

db.user.update(
{},
{"$inc":{"age":1}},
{"multi":true}
)

年龄都-10

db.user.update(
{},
{"$inc":{"age":-10}},
{"multi":true}
)
常规修改操作

设数据为{'name':'武松','age':18,'hobbies':['做煎饼','吃煎饼','卖煎饼'],'addr':{'country':'song','province':'shandong'}}

update db1.user set age=23,name="武大郎" where name="武松";

1、覆盖式

db.user.update(
{"name":"武松"},
{"age":23,"name":"武大郎"}
)

得到的结果为

2、局部修改:$set

db.user.update(
{"name":"武松"},
{"$set":{"age":15,"name":"潘金莲"}}
)

得到的结果为

3、改多条:将multi参数设为true

db.user.update(
{"_id":{"$gte":1,"$lte":2}},
{"$set":{"age":53,}},
{"multi":true}
)

4、有则修改,无则添加:upsert参数设为true

db.user.update(
{"name":"EGON"},
{"$set":{"name":"EGON","age":28,}},
{"multi":true,"upsert":true}
)

5、修改嵌套文档:将国家改为日本

db.user.update(
{"name":"潘金莲"},
{"$set":{"addr.country":"Japan"}}
)

6、修改数组:将第一个爱好改为洗澡

db.user.update(
{"name":"潘金莲"},
{"$set":{"hobbies.1":"洗澡"}}
)

删除字段:不要爱好了

db.user.update(
{"name":"潘金莲"},
{"$unset":{"hobbies":""}}
)
mongodb面试问题总结(你不知道的事情)
mongodb如何处理Secondary不一致情况
在MongoDB的副本集(Replica Set)中,Secondary节点通常用于数据同步和故障转移。然而,在某些情况下,Secondary节点可能会出现不一致的情况,这需要特别处理以确保整个系统的稳定性和数据一致性。
处理Secondary不一致情况的步骤:
首先,需要停止出现不一致问题的Secondary节点的服务,并移除其数据目录。
在关闭服务并移除数据目录后,重新启动MongoDB服务,并开启自动同步机制。这样可以利用主节点(Primary)的oplog日志来恢复Secondary节点的数据一致性。
如果上述方法无法快速解决问题,可以考虑从另一个健康的Secondary节点获取数据快照。具体操作是:在数据不变化的情况下,从健康的Secondary节点上获得一致性的备份快照,然后拷贝至故障节点中,并启动MongoDB服务,应用oplog日志以恢复数据一致性。
如果因为Primary节点损坏而只剩下Secondary节点,可以通过将Secondary节点强制提升为主节点来继续集群的运行。不过这种方法需要谨慎使用,因为这会改变整个副本集的结构。
对于同步慢的问题,可以通过调整oplog的大小、减少写入QPS等手段来提高Secondary节点的同步速度,从而避免长时间的延迟和不一致性。
定期检查副本集的状态和同步进度,使用rs.status ()命令查看当前状态,并根据需要调整配置参数,如调整oplog的大小或调整副本集成员的优先级等。
通过以上步骤,可以有效地处理MongoDB副本集中Secondary节点的不一致情况,确保系统的高可用性和数据的一致性。
mongodb shard划分原理
MongoDB的分片(Sharding)机制是一种将数据集分布到多个服务器上的技术,以提高数据库的可扩展性和性能。分片通过选择一个或多个片键(Shard Key)来实现,这些片键可以是单个字段或复合字段,并且必须建立索引。
分片键的选择
选择合适的分片键对于数据分布的均匀性和查询性能至关重要。理想的分片键应该能够使写入操作均匀地分配到各个分片上,并且在查询时能够有效地利用索引。常见的分片键类型包括:
数值型分片键:例如,可以根据文档中的某个数值字段(如时间戳、设备ID等)进行分片。这种情况下,MongoDB会将数值范围划分为不重叠的区间,每个区间对应一个chunk(数据块),并将其分配到不同的分片上。
哈希型分片键:使用哈希函数计算字段的哈希值作为片键。这种方式通常用于减少定向操作和增加广播操作的场景。
分片过程
分片过程主要分为以下几个步骤:
定义分片键:确定用于分片的片键,这可以是一个单一字段或复合字段。
创建索引:为片键创建索引,确保其唯一性和高效性。
初始化分片:在空集合或非存在的集合中定义分片区域和相应的chunk范围。初始分片操作会根据定义的区域范围创建chunk,并进行初步的分布。
数据迁移与重新分片:如果需要改变分片键或者进行数据迁移,可以通过MongoDB提供的命令来重新分片。需要注意的是,MongoDB 5.0开始支持更改分片键,但这一操作可能会影响数据分布。
分片组件
一个典型的MongoDB分片集群由以下组件组成:
Shard:每个shard包含一部分分片数据,可以部署为复制集( replica set)以提高可靠性。
mongos:作为查询路由器,提供客户端应用程序与分片集群之间的接口。从MongoDB 4.4版本开始,mongos支持平衡读取以最小化延迟。
config server:存储元数据信息,管理分片的状态和配置。
注意事项
不可修改性:一旦集合被分片,shard key是不能修改的,因此在分片前应仔细选择合适的片键。
性能影响:不恰当的片键会导致数据分布不均,从而影响查询性能和整体系统性能。
数据一致性:在进行分片操作时,需要确保数据的一致性和完整性,避免因分片导致的数据丢失或错误。
通过合理选择和配置分片键以及遵循上述步骤,可以有效地利用MongoDB的分片机制来提升数据库的可扩展性和性能。
MongoDB索引分配设计
在MongoDB中,索引的设计和分配是提升数据库性能的关键步骤。合理的索引设计可以显著提高查询效率,减少数据扫描时间,并优化读写操作的性能。以下是一些关于MongoDB索引分配设计的专业建议:
索引是对数据库表中一列或多列的值进行排序的一种结构,可以帮助数据库系统更快地定位到数据。没有索引时,MongoDB在读取数据时必须扫描集合中的每个文件并选取符合查询条件的记录。
选择适当的索引类型:
单字段索引:适用于基于单个字段的简单查询。
复合索引:适用于涉及多个字段的查询。复合索引中的字段顺序非常重要,因为它们决定了查询的执行路径。
唯一索引:确保集合中某一字段的唯一性,常用于主键。
文本索引:对全文搜索优化得更好,但不适合精确匹配和排序查询。
在设计索引时,需要仔细考虑查询模式和数据模式。根据查询中经常使用的字段、排序顺序、字段的基数和查询频率等因素来选择合适的索引类型和字段顺序。
对于复杂的查询,可以通过研究explain()命令的输出结果来分析索引的优劣,并学习MongoDB的索引优化器。复合索引的字段顺序应与查询中的比较、排序以及范围过滤运算相匹配,以达到最优效果。
合理使用索引可以提高数据查询的效率和性能,但也需要注意索引的管理和维护。定期检查和调整索引以应对数据变化和查询需求的变化。
使用最少的索引满足用户查询需求,可极大提升数据库性能,减少存储成本。过多的索引会增加写入操作的开销,反而降低性能。
对于大数据集或非常高吞吐量的应用,可以采用分片(sharding)技术将数据分布在不同的服务器上。分片键的选择应确保数据均匀分布到各个分片中。
通过以上方法,可以有效地设计和分配MongoDB的索引,从而提升数据库的整体性能和可扩展性。

标签:总结,name,dbabd,mongodb,db,admin,user,分片,技能
From: https://www.cnblogs.com/huang-1123/p/18356816

相关文章

  • 个人技能总结-ES集群部分技能总结
    ES集群架构总结规划ES应用场景Elasticsearch(ES)是一款功能强大的分布式搜索引擎,广泛应用于各种场景。以下是其主要应用场景的详细介绍:Elasticsearch被广泛用于构建全文搜索引擎,能够快速而准确地搜索大量的文本数据,并提供高效的分析和聚合功能。例如,维基百科和百度百科使用ES进......
  • 个人技能总结-kafka部分
    kafka集群部分技能总结kafka集群架构Kafka集群的规划和架构设计是构建高性能、高可用性和可扩展性的分布式消息系统的关键。以下是关于Kafka集群规划和架构的详细说明:Kafka集群的基本组成Kafka集群主要由以下几个核心组件构成:生产者(Producer):负责向Kafka主题(Topic)发送消息的......
  • 掌握 schtasks 的高级功能,并有效管理和调度复杂任务。深入的 schtasks 使用指导,帮助用
    schtasks是一个Windows命令行工具,用于创建、删除、配置或显示计划任务。你可以用它来安排任务的自动执行,比如运行脚本或程序。schtasks的功能可以分为以下几类:创建任务:设定新任务的执行时间、频率和程序。删除任务:移除已存在的任务。修改任务:更新任务的执行时间、条件或......
  • CSS笔记总结(Xmind格式):第二天
    Xmind鸟瞰图:简单文字总结:css知识总结:复合选择器:  1.交集选择器:在一个选择器的基础上,再增加一个选择器来增加条件(中间不能有任何符号包括空格)  2.并集选择器:多个选择器之间用逗号隔开,表示同时选择多个标签使用样式  3.后代选择器:使用空格分隔  4.子元......
  • JavaScript高阶笔记总结(Xmind格式):第三天
    Xmind鸟瞰图:简单文字总结:js高阶笔记总结:严格模式:  1.开启严格模式:"usestrict"  2.不使用var关键字声明会报错  3.严格模式下普通函数的this指向undefined高阶函数:  满足其中之一即高阶函数:    1.函数作为参数    2.函数作为返回值......
  • 智能汽车技能矩阵(1)——从系统到领域
    智能汽车技能矩阵(1)——从系统到领域从业智能汽车需要具备什么技能?聚焦这个问题准备开启一个新的系列,即所谓的“技能矩阵”——SkillMatrix。附赠自动驾驶最全的学习资料和量产经验:链接插件概念ASPICE3.1图示中的插件概念,如下图。来自ASPICE3.1如上图,产品分解为不......
  • 5. MongoDB 集合创建、更新、删除
    1.创建集合1.1语法db.createCollection(name,options)参数说明:name:要创建的集合名称。options:可选参数,指定有关内存大小及索引的选项。options可以是如下参数:参数名类型描述示例值capped布尔值是否创建一个固定大小的集合。truesize数值集合的最大大小(以字......
  • 5. MongoDB 文档插入、更新、删除、查询
    1.插入文档文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似JSON的二进制形式的存储格式,是BinaryJSON的简称。常用的插入文档方法包括:db.collection.insertOne():插入单个文档db.collection.insertMany():插入多个文档db.collection.sav......
  • 分布式知识总结(一致性Hash算法)
    文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/文章收录在网站:http://hardyfish.top/一致性Hash算法假如有三台服务器编号node0、node1、node2,现在有3000万个key,希望可以将这些个key均匀的缓存到三台机......
  • 2024.8.12 总结(集训)
    破防的一天。TQX来给我们讲课。stOTQXOrz讲的是二分图和网络流。感觉内容很多,而且比较难,讲得对我来说比较快。很多东西我还没懂就过了,有时我还走神了,没听到。胡老师说今天是见图论的“天”,网络流是图论的天花板,本来就没打算让我们今天全部听懂。下午看了一下午别人的博客、......