2023/5/15之前关于MongoDB的学习实践

Posted weakxy-home

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023/5/15之前关于MongoDB的学习实践相关的知识,希望对你有一定的参考价值。

show dbs/collections/tables;
use 库 创建库
db.dropDatabase(); 删除库
db.createCollections(\'\'); 创建集合
db.集合.drop(); 删除集合
db.集合.insertOne/Many 集合中插入数据
db.集合.remove(); 删除文档
for(let i=x;i<x;i++) 循环操作
db.集合.update(条件,$set:更改后) set的作用是保留除更改之外的值(原来的版本如果不写set的话,其他字段默认删除,版本6会报错)
db.集合.find([条件],[查询字段字段:0/1(1返回)])[.pretty()超过一定长度的文档格式化]; 查询集合
查询条件:
等于: 小于:$lt 小于等于:$lte 大于:$gt 大于等于:$gte 不等于:$ne
mysql中and ==> 逗号, 如果字段相同,以最后一个为准
mysql中or ==> $or:[条件,条件]
模糊查询: 使用正则表达式
数组查询: 跟普通查询相同,特殊$size:查询数组符合长度的
排序: .sort(字段:1/-1)1升,-1降
分页: .skip(第几页).limit(一页几条)
.count计数
.distinct去重


$type 按照数据类型(object/简写1,string/简写2,double3,array4) 例: $type:4

索引:查询b+树,类似于mysql的自增id
  getIndexes,createIndex(需要建立索引的字段(可以是复合(一个索引由多个key维护)),其他可选参数(name,unique唯一,expireAfterSeconds))
  dropIndex("索引名称"),totalIndexSize()索引占用大小,
  关于复合索引(要符合左前缀原则,比如字段id,name,age,那么id,age不能组成复合索引,而name,age/id,name可以(顺序可以变更))(排序中也符合这种原则)

聚合查询aggregate类似于mysql中count, 例db.集合.aggregate([$group:_id: "$字段名" , num_tutorial: $sum : 1]) (以字段名为组求和)

副本集:是mongodb中具有自动故障转移的主从集群,主要解决高可用问题,无法解决单点压力问题(这个需要集群完成)

  搭建副本集:./mongod --port 27017 --dbpath ../rep1/data1(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost:27018,localhost:27019]

        ./mongod --port 27018 --dbpath ../rep1/data2(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost:27017,localhost:27019]

        ./mongod --port 27019 --dbpath ../rep1/data3(需创建) --bind_ip 0.0.0.0 --replSet 副本集名称/[localhost:27017,localhost:27018]

        初始化副本集:var config = _id:副本集名称, members:[_id:0, host:"localhost: 27017", 第二, 第三]

               rs.initiate(config)

  副本集主节点默认可读可写,从节点不可读写(可以通过rs.secondaryOK授予读权限)        

在MongoDB中分区数据的最佳实践是什么?

我正在使用平均堆栈创建一个社交网站,我需要一些关于mongoDB和mongoose的建议。我是初创公司的一员,我们决定使用这些惊人的技术来完成我们的任务。

基本上,我需要一些建议。

目前,我已经完成了简单的CRUD创建并实现了本地护照JS。我目前在我的mongoDB中有一个名为users的集合。

我们的社交网站将拥有一个与单个用户相关的博客,市场和许多其他页面(功能)。

由于我之前从未使用过mongoDB,所以我很好奇mongoDB应该为每个用户使用一个集合还是为每个功能设置多个集合。

为了澄清它,假设我使用User模型进行用户注册,博客模型用于博客等。

如果您不久将向我解释如何构建我的猫鼬模型,如果所有数据都应该在一个集合中,或者如果一个用户应该具有不同功能的单独集合,那么这对我来说真的意味着很多。如果您推荐多个集合,我如何将这些集合链接在一起,并确保为一个用户等保存所有数据。

非常感谢提前!

答案

如果您使用mongoDB作为REST接口的后端,最佳做法是在每个资源的集合上创建。例如,如果您打算使用/api/users端点,则应该拥有用户集合,并且它应该包含您要在该端点上返回的任何内容和所有内容。

如果使用节点编译服务器端模板,则结构可以更灵活。在这种情况下,上面仍然适用(因为您可能最终希望公开REST服务),但是有更多的灵活性。实际上,如果多对多样式关系是合适的,则可以更容易地将这些集合分开并在同一页面中将它们加载在一起。

顺便说一句,你提到有用户和市场。比将数据分成集合更大的问题是交易的使用。每当您打算执行数据事务时,都应该在SQL事务中执行。 MongoDB中没有交易概念。这是设计使然,因为MongoDB旨在成为一个快速,可扩展的数据存储。在这种情况下,合并SQL和noSQL数据并不是不合理的。

另一答案

我将解释分区/分为两个级别。

  1. 当然,您将为不同的模型创建不同的集合。例如用户,博客,消息等。
  2. 如果我们谈论的是数百万的数据,现在是第2部分。如何对它们进行分区以便更快地查找数据例如,您有1M个用户,您将把它们放在一个大的“用户”集合中。但是,如果您寻找名字为“Imdad”且年龄为28岁的用户,现在您的查询将查看单个“用户”集合中的这些1M项目,这将花费大量时间。

为了解决这个问题,用户集合可以通过水平分区(Users1(年龄在10-20之间),Users2(年龄在20-30之间),Users3(年龄在30-40之间))分为多个集合。现在基于您的查询谓词monggoDB将查找不同的集合。这就是MongoDB像其他SQL DB一样应用的想法。您不必显式执行查询到块集合,但mongoDB本身会处理它。

Shard key generation

Mongoose shard key

以上是关于2023/5/15之前关于MongoDB的学习实践的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB开发最佳实践

最佳实践从 0 开始,用 flask+mongodb 打造分布式服务器监控平台

2023/5/15

MongoDB Best Practice

MongoDB最佳安全实践

MongoDB最佳安全实践