关于mongodb:暂缓MongoDB-442-443-444版本升级-存在严重Bug

据 MongoDB 官网公布:从 4.4.2~4.4.4 版本升级到 4.4.8+ 或 5.0.2 +版本时,存在重大 bug ,有降级打算的搭档们请暂缓施行。 造成起因降级过程中即便失常敞开了mongod实例,MongoDB仍有可能应用WT引擎metadata文件中的错误信息,从而应用谬误的checkpoint,导致MongoDB中的数据产生不统一。 问题形容4.4.2、4.4.3、4.4.4版本在彻底敞开时留下一段有效的元数据。咱们在 4.4.5 中开始应用元数据进行决策时发现并修复了该谬误。在 4.4.8 和更新版本中,咱们增加了假如元数据正确的代码,当它不正确时,WiredTiger 能够删除降级后应保留的内容。解决方案正在应用上述版本的搭档们临时不要降级,期待修复该问题后再降级。 软件介绍MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中性能最丰盛,最像关系数据库的。 它反对的数据结构十分涣散,是相似 json 的 bjson 格局,因而能够存储比较复杂的数据类型。 它反对的查询语言十分弱小,其语法有点相似于面向对象的查询语言,简直能够实现相似关系数据库单表查问的绝大部分性能,而且还反对对数据建设索引。 MongoDB 服务端可运行在 Linux、Windows 或 OS X 平台,反对 32 位和 64 位利用,默认端口为 27017。举荐运行在 64 位平台,因为 MongoDB 在 32 位模式运行时反对的最大文件尺寸为 2GB。 性能个性它的特点是高性能、易部署、易使用,存储数据十分不便。 次要性能个性有: 面向汇合存储,易存储对象类型的数据。模式自在反对动静查问反对齐全索引,蕴含外部对象反对查问反对复制和故障复原应用高效的二进制数据存储,包含大型对象(如视频等)主动解决碎片,以反对云计算档次的扩展性反对RUBY,PYTHON,JAVA,C++,PHP等多种语言文件存储格局为BSON(一种JSON的扩大)可通过网络拜访整体架构 外部架构

November 16, 2021 · 1 min · jiezi

关于mongodb:mongo的常见命令和问题分析

1. 老手mongo命令不理解,怎么办。这几个命令真的很有用。 help 命令db.help() // 数据库rs.help() // rs相干的命令sh.help() // 数据库集群分片的相干命令db.listCommands()db.myCollotion.stats() // 查看文档统计信息2. 查看mongo的服务器的配置信息或者批改我的项目参数db.adminCommand({getParameter:"*"}) //获取参数db.runCommand({serverStatus:1}); // 整个服务器状态,字段很多。db.runCommand({serverStatus:1}).flowControl; // 查看流控制字段db.serverStatus().wiredTiger.cache //db.adminCommand({setParameter:1, wiredTigerEngineRuntimeConfig:'cache_size=600M'}) // 动静调整缓存的大小3. mongo查问currentOp的操作db.currentOp( { "active" : true, "secs_running" : { "$gt" : 3 }, //运行工夫大于3秒 "ns" : /^db1\./ // 含糊查询数据库的名称 }) db.currentOp({"waitingForFlowControl": true}); // 运行的列表中蕴含flowControll字段db.currentOp({"waitingForLock": true}); // 正在等锁的操作4. mongo的存储引擎wiredTigerhttps://my.oschina.net/u/4302...https://www.developer.com/des...http://source.wiredtiger.com/... (wiredTiger外部参数配置)https://blog.csdn.net/weixin_... (mmongodb分片性能慢_百万级高并发mongo集群性能数十倍晋升优化实际)https://www.cnblogs.com/xibuh... (wiredTiger淘汰缓存代码)5. mongo的监控等文档参考文档MongoDB具体表级操作统计及具体时延统计实现原理 : https://mongoing.com/archives... 1.mongostat 官网形容 https://docs.mongodb.com/v4.2... 6. mongo缓存文档常见问题解答:MongoDB的缓存 : https://mongoing.com/archives...

November 15, 2021 · 1 min · jiezi

关于mongodb:mongoTemplate-常用实操

Java mongoTemplate 应用mongoTemplate表白mongo shell表达式。应用spring boot集成mongo,而后间接跑test实操蕴含,$group,$project等操作 package com.example.springboot;import lombok.Builder;import lombok.Getter;import lombok.Setter;import lombok.ToString;import org.aspectj.lang.annotation.Before;import org.assertj.core.util.Lists;import org.junit.jupiter.api.BeforeAll;import org.junit.jupiter.api.BeforeEach;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.annotation.Id;import org.springframework.data.domain.Sort;import org.springframework.data.mongodb.core.BulkOperations;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.aggregation.*;import org.springframework.data.mongodb.core.mapping.Document;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.data.mongodb.core.query.UpdateDefinition;import org.springframework.data.util.Pair;import org.springframework.util.StringUtils;import javax.swing.*;import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.regex.Pattern;import java.util.stream.Collectors;import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregationOptions;/** * @see com.example.springboot.SpringbootApplicationTests#testProject() */@SpringBootTestclass SpringbootApplicationTests { @Autowired private MongoTemplate mongoTemplate; @Test void contextLoads() { } /** * 初始化student数据 */ @Test public void setupData(){ Student student = Student.builder() .id("1").name("张三").age(15).chinese(90).maths(95).physics(93).chemistry(100).biology(99).english(98).build(); Student student1 = Student.builder() .id("2").name("李四").age(18).chinese(80).maths(90).physics(93).chemistry(88).biology(93).english(83).build(); Student student2 = Student.builder() .id("3").name("王五").age(16).chinese(72).maths(80).physics(84).chemistry(77).biology(79).english(72).build(); Student student3 = Student.builder() .id("4").name("王小二").age(20).chinese(72).maths(80).physics(84).chemistry(77).biology(79).english(72).build(); Student student4 = Student.builder() .id("5").name("jim").age(20).chinese(72).maths(80).physics(84).chemistry(77).biology(79).english(79).build(); List<Student> students = Lists.newArrayList(student,student1, student2,student3, student4); BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Student.COLLECTION); bulkOperations.insert(students); bulkOperations.execute(); } /** * 初始化书籍数据 */ @Test public void setupBooksData(){ Book apue = Book.builder().id("1").title("apue").author("stevens").type("computer").copies(8).build(); Book mysqlInAction = Book.builder().id("2").title("mysql in action").author("lee").type("computer").copies(10).build(); Book redisInAction = Book.builder().id("3").title("redis in action").author("lee").type("computer").copies(5).build(); Book englishABC = Book.builder().id("4").title("english A B C").author("li lei").type("english").copies(15).build(); Book toefl = Book.builder().id("5").title("toefl").author("li lei").type("english").copies(10).build(); Book chinese = Book.builder().id("6").title("chinese A B C").author("zhang san").type("chinese").copies(12).build(); List<Book> students = Lists.newArrayList(apue, mysqlInAction, redisInAction, englishABC, toefl, chinese); BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Book.COLLECTION); bulkOperations.insert(students); bulkOperations.execute(); } @Test public void insertOneStudent(){ Student student3 = Student.builder() .id("7").name("jeff").age(19).chinese(73).maths(80).physics(84).chemistry(77).biology(79).english(72).build(); mongoTemplate.insert(student3); } /** * 数据中没有则保留,有这更新 */ @Test public void saveOneStudent(){ Student student3 = Student.builder() .id("7").name("jeff").age(100).chinese(73).maths(80).physics(84).chemistry(77).biology(79).english(72).build(); mongoTemplate.save(student3); } @Test public void batchSave(){ // 见数据初始化处 } /** * update 批量更新, */ @Test public void testBatchUpdate(){ List<Pair<Query, Update>> updates = new ArrayList<>(); for (int i = 0; i < 5; i ++){ Query query = new Query(); Criteria criteria = new Criteria().and("_id").is(i+ ""); query.addCriteria(criteria); Update update = Update.update("age", i); updates.add(Pair.of(query, update)); } BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "student"); bulkOperations.updateMulti(updates); bulkOperations.execute(); } /** * 将查问进去的后果对立批改。 * mongoTemplate.upsert 办法,如果不存在,则新建一条记录。存在则更新,十分有用。 */ @Test public void testUpdate(){ Query query = new Query(); Criteria criteria = new Criteria().and("age").is(18); query.addCriteria(criteria); UpdateDefinition update = Update.update("english", 99); mongoTemplate.updateMulti(query, update, "student"); } /** * find $in */ @Test public void testFindByIn(){ Query query = new Query(); Criteria criteria = new Criteria().and("age").in(18,19,20); query.addCriteria(criteria);// query.withHint("age"); // 举荐mongo应用索引 query.skip(1); query.limit(10); query.with(Sort.by(Sort.Direction.DESC, "age")); String qString = query.getQueryObject().toString(); System.out.println(qString); List<Student> students = mongoTemplate.find(query, Student.class); System.out.println(students); } /** * 正则 * db.student.find({name : /Jim/i}); 都是疏忽大小写的 * db.student.find({name : {$regex: "Jim", $options: "$i"}}); */ @Test public void testFindByRegex(){ String regexStr = "^JI";// Criteria criteria = new Criteria().and("name").regex(regexStr, "I"); // I 疏忽大小写 Pattern pattern = Pattern.compile(regexStr, Pattern.CASE_INSENSITIVE); Criteria criteria = new Criteria().and("name").regex(pattern); Query query = Query.query(criteria); List<Student> students = mongoTemplate.find(query, Student.class); System.out.println(students); } /** * group author. * "pipeline" : [{ "$match" : {}}, { "$group" : { "_id" : "$author", "copiesTotal" : { "$sum" : "$copies"}, "copiesMax" : { "$max" : "$copies"}, "avg" : { "$avg" : "$copies"}}}] */ @Test public void TestGroup() { List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); // todo 减少过滤条件 operations.add(Aggregation.match(criteria)); GroupOperation groupOperation = new GroupOperation(Fields.fields("author")). sum("copies").as("copiesTotal"). max("copies").as("copiesMax"). avg("copies").as("avg"); operations.add(groupOperation); Aggregation aggregation = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "book", Map.class); System.out.println(aggregationResults.getMappedResults()); } /** * $group 字段为null时,去所有$match匹配的文档都为一个分组。 * $push 将字段退出某个数组,所有group的分组中的字段都退出 * $addToSet 和push相比会去重 * * "pipeline" : [{ "$match" : {}}, { "$group" : { "_id" : null, "authurs" : { "$push" : "$author"}}}, { "$project" : { "_id" : 0}}] * "pipeline" : [{ "$match" : {}}, { "$group" : { "_id" : null, "authors" : { "$push" : "$author"}, "uniqueAuthors" : { "$addToSet" : "$author"}}}, { "$project" : { "_id" : 0}}] */ @Test public void testPush(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); operations.add(Aggregation.match(criteria)); GroupOperation groupOperation = Aggregation.group(). push("author").as("authors") .addToSet("author").as("uniqueAuthors"); operations.add(groupOperation); ProjectionOperation projectionOperation = Aggregation.project().andExclude("_id"); operations.add(projectionOperation); Aggregation aggregation = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "book", Map.class); System.out.println(aggregationResults.getMappedResults()); } /** * $unwind 根据某个字段数组拆分成独自的文档。 * "pipeline" : [{ "$match" : {}}, { "$group" : { "_id" : null, "authors" : { "$push" : "$author"}, "uniqueAuthors" : { "$addToSet" : "$author"}}}, { "$project" : { "_id" : 0}}, { "$unwind" : "$authors"}] */ @Test public void testUnwind(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); operations.add(Aggregation.match(criteria)); GroupOperation groupOperation = Aggregation.group(). push("author").as("authors") .addToSet("author").as("uniqueAuthors"); operations.add(groupOperation); ProjectionOperation projectionOperation = Aggregation.project().andExclude("_id"); operations.add(projectionOperation); operations.add(Aggregation.unwind("authors")); Aggregation aggregation = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "book", Map.class); System.out.println(aggregationResults.getMappedResults()); } /** * project解决english和maths之和,并不输入id字段。 * "pipeline" : [{ "$match" : {}}, { "$project" : { "ts" : { "$add" : ["$english", "$maths"]}, "_id" : 0}}] */ @Test public void testProject(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); operations.add(Aggregation.match(criteria)); ProjectionOperation projectionOperation = new ProjectionOperation(); Fields fields = Fields.fields("student"); projectionOperation.andInclude(fields); projectionOperation = Aggregation.project().and("english").plus("maths").as("ts").andExclude("_id"); operations.add(projectionOperation); Aggregation aggregation = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "student", Map.class); System.out.println(aggregationResults.getMappedResults()); } /** * project 输入指定字段,排除其余字段 * "pipeline" : [{ "$match" : {}}, { "$project" : { "name" : 1, "english" : 1, "maths" : 1, "chinese" : 1, "_id" : 0}}] */ @Test public void testProjectField(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); operations.add(Aggregation.match(criteria)); ProjectionOperation projectionOperation = new ProjectionOperation(); Fields fields = Fields.fields("name", "english", "maths", "chinese"); projectionOperation = projectionOperation.andInclude(fields).andExclude("_id"); // Aggregation.project(fields).andExclude("_id"); operations.add(projectionOperation); Aggregation aggregation = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "student", Map.class); System.out.println(aggregationResults.getMappedResults()); } /** * 统计学生几门课的总分。 * 存在问题,如果一个学生的某个课程分数为null,或者活没有该字段,则统计的total为null. * "pipeline" : [{ "$match" : {}}, { "$project" : { "total" : { "$add" : ["$english", "$maths", "$chinese"]}}}] */ @Test public void testAggregate(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); operations.add(Aggregation.match(criteria)); ProjectionOperation projectionOperation; AggregationExpression aggregationExpression = ArithmeticOperators.Add.valueOf("english") .add("maths") .add("chinese"); projectionOperation = Aggregation.project().and(aggregationExpression).as("total"); operations.add(projectionOperation); Aggregation aggregation1 = Aggregation.newAggregation(operations) .withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Map> aggregationResults1 = mongoTemplate.aggregate(aggregation1, "student", Map.class); System.out.println(aggregationResults1.getMappedResults()); } /** * 怎么多个$or一起操作。 * "pipeline" : [{ "$match" : { "name" : "张三", "$or" : [{ "maths" : { "$gte" : 90}}, { "english" : { "$gte" : 90}}, { "chinese" : { "$gte" : 90}}]}}] */ @Test public void testOrOperation(){ List<AggregationOperation> operations = Lists.newArrayList(); Criteria criteria = new Criteria(); criteria = criteria.and("name").is("张三"); Criteria criteria1 = new Criteria().and("maths").gte(90); Criteria criteria2 = new Criteria().and("english").gte(90); Criteria criteria3 = new Criteria().and("chinese").gte(90); criteria = criteria.orOperator(criteria1, criteria2, criteria3); operations.add(Aggregation.match(criteria)); Aggregation aggregation = Aggregation.newAggregation(operations).withOptions(newAggregationOptions().allowDiskUse(true).build()); AggregationResults<Student> results = mongoTemplate.aggregate(aggregation, "student", Student.class); System.out.println(results.getMappedResults()); } @Setter @Getter @ToString @Document(Student.COLLECTION) @Builder static class Student{ public static final String COLLECTION = "student"; public static final String MATHS = "maths"; public static final String CHINESE = "chinese"; public static final String ENGLISH = "english"; public static final String PHYSICS = "physics"; public static final String CHEMISTRY = "chemistry"; public static final String BIOLOGY = "biology"; @Id private String id; private String name; private int age; private int maths; private int chinese; private int english; private int physics; private int chemistry; private int biology; } @Setter @Getter @ToString @Document(Book.COLLECTION) @Builder static class Book { public static final String COLLECTION = "book"; @Id private String id; private String title; private String author; private int copies; // 库存数 private String type; }}

November 15, 2021 · 5 min · jiezi

关于mongodb:议程公布2021年MongoDB中文社区南京技术沙龙

2021年MongoDB南京线下技术交流会将于11月20日(周六)在南京雨花台区进行。本次会议由MongoDB中文社区、MongoDB官网和Tapdata联结举办。会上咱们将判若两人地把MongoDB一手干货和实际分享带给大家,并设置QA环节,让您有机会与嘉宾讲师进行交换探讨。欢送各位 mongoer携友同来! 大会速递Conference工夫:2021年11月20日下午(星期六) 地点:南京市雨花台区·紫荆花路2号 新晶丽酒店 名额: 100人 报名链接:http://hdxu.cn/mK7Vq 【1元票】支付1元票请关注文末介绍,应用优惠码后票价为1元。 大会议程Agenda 嘉宾及议题Guests&Topics陈亮亮 MongoDB中文社区南京分会主席 议题:你须要理解的MongoDB日常运维 在本演讲中,咱们将讲述日常应用MongoDB数据库的参数配置,以及常见的一些故障场景,合成如何进行数据和业务复原。 听众受害: 理解MongoDB的配置,帮忙本人实例正确配置参数;各种故障场景疾速复原。分享嘉宾介绍:陈亮亮 MongoDB中文社区南京分会主席; 近景能源团体数据库架构师;曾任UCloud负责UDB MongoDB的研发和运维工作,在数据库架构和调优方面有丰盛的教训。 江鑫 MongoDB解决方案架构师 议题:MongoDB利用数据平台助力疾速构建您的利用 MongoDB提供业界首款利用数据平台,帮忙企业以更简化形式构建业务利用。在本演讲中,咱们将联合不同行业的典型客户胜利案例,分享如何借助MongoDB利用数据平台,以更少的精力来构建并优化数据基础设施,让团队抽出更多工夫,关注翻新和独特的差异化竞争劣势。 听众受害: 当今市场趋势与MongoDB;MongoDB 利用数据平台新技术解读;MongoDB 典型客户胜利案例分享。分享嘉宾介绍:江鑫MongoDB解决方案架构师,目前从事基于MongoDB的数据平台解决方案的征询与设计,致力于MongoDB在各行业多场景中的利用解决方案的设计与实际。 黄震 南京市秦淮区老师倒退核心信息中心主任 议题:数据中台在教育零碎的实际—应用MongoDB构建服务化数据平台 最近数据中台颇有7-8年前大数据平台带来的冷落。数据中台是以业务驱动为导向,采纳分布式实时数据库作为技术底座,通过汇聚,整合企业的数据孤岛,以数据服务为激励翻新提供了一个十分高效疾速的数据平台。本次会上,秦淮区教委信息中心的黄主任将为大家分享秦淮区教育信息化建设过程中是如何应用MongoDB 作为数据中台技术,打造一个教育数据服务化平台,并在教育数据大屏,对立认证,新型学生利用开发上取得的功效。 听众受害: 以后教育 IT 信息化建设过程中的痛点;如何通过实时数据中台为教育赋能。分享嘉宾介绍:黄震南京市秦淮区老师倒退核心信息中心主任; 江苏省人工智能教育专委会委员; 次要钻研教育城域网平台建设,教育人工智能利用,教育大数据利用。 欧阳鸿荣南京大学硕士研究生 议题:MongoDB数据一致性协定的规约与测试 作为当今最风行的分布式文档型数据库,MongoDB在保证系统高可用的前提下,为用户提供了多种可选的一致性保障。纵观MongoDB的倒退历程,其在3.6版本提供了对因果一致性的反对,又别离于4.0和4.2版本提供了对单正本集多文档事务和跨分片多文档事务的反对。历经数年的开发,MongoDB曾经构建起了一套残缺的数据一致性体系。本次报告将分享咱们DisAlg实验室对于MongoDB数据一致性协定的两份钻研工作,一份是针对因果一致性协定的测试工作,另一份是针对分布式事务快照隔离协定的规约与测试工作。 听众受害: 1.理解MongoDB的不同部署架构; 2.理解MongoDB因果一致性的应用办法、实用场景与测试方法; 3.理解MongoDB事务协定的实现原理、规约与测试。 分享提纲: MongoDB部署架构与一致性协定介绍MongoDB一致性协定的规约与测试MongoDB因果一致性的测试MongoDB事务一致性的剖析与测试3.将来工作打算分享嘉宾介绍:欧阳鸿荣南京大学计算机科学与技术系硕士研究生,钻研方向为分布式数据库与形式化办法。在黄宇传授与魏恒峰老师的领导下从事于MongoDB数据一致性协定的相干钻研,以后专一于MongoDB事务一致性协定的规约与测试。现场QA互动 QA Interaction在四位嘉宾分享完结之后,咱们将进入【漫话MongoDB】环节。 在本环节,您能够充分利用机会与嘉宾和现场参会敌人进行互动,模式包含不限于: 您能够就现场嘉宾讲师的分享内容提出MongoDB相干问题进行QA互动;咱们给不能来南京线下相聚的敌人开设了线上直播,线上的mongoers能够点此预约直播:http://www.itdks.com/Home/Act... 直播过程您有什么想理解的问题,能够将问题发给小芒果(微信ID: mongoingcom),咱们将选取局部问题邀请现场讲师答复; 您能够与现场的参会者敌人交换(本次会议咱们将给参会者敌人送带有本人姓名及公司信息的贴纸,您能够与现场敌人进行交换探讨)。大会报名Register【全价票】 用户组大会,费用:120 元。 【1 元票】分享取得大会1元票,写一段举荐语分享本文到朋友圈,将分享截图发给小芒果,通过审核即可获取优惠码。 【购票链接】 http://hdxu.cn/mK7Vq 长按扫描二维码 增加小芒果微信获取免优惠码 大会奖品Prizes 【参会领礼品】 将本流动转发至朋友圈,集赞20个,凭微信链接分享记录在会场签到处支付流动现场礼品一份:MongoDB定制T恤、马克杯套装等周边礼品【数量无限,先到先得】Apple HomePod mini智能音箱,MongoDB定制商务背包,MongoDB最新书籍《MongoDB 进阶与实战》,抽奖大礼尽在MongoDB中文社区南京流动现场等你拿!【分享流动领礼品】 将本流动文章转发到微信朋友圈并集赞30个,将分享截图提交到此链接: ...

November 2, 2021 · 1 min · jiezi

关于mongodb:MongoDB技术实践与应用案例征集活动

MongoDB中文社区从成立以来就意识到博客的价值,专一于建设国内最大的MongoDB技术交流平台(mongoing.com)。10月13日,社区开启MongoDB技术实际与利用案例征集流动,面向宽广MongoDB用户敌人收录MongoDB技术实践经验与利用案例,将技术实际分享给社区用户,进步用户对MongoDB利用场景及技术的理解。 在征集过程咱们也将开掘MongoDB深度用户,促成技术流传与交换,为更多MongoDB数据库用户提供技术利用参考,同时为MongoDB深度用户提供分享平台,建设本身在MongoDB技术圈的集体品牌,发明更多交流学习与展现的机会。 【征集流动要点】流动主题: MongoDB技术实际与利用案例征集流动 征集范畴: MongoDB数据库利用场景和行业利用案例利用场景与案例分享因素参考:业务背景,选型理由,相干性能,利用技术,解决方案,功效。 MongoDB技术利用与实际公司或行业在某种需要场景下的MongoDB利用技术实际,应用MongoDB数据库过程遇到的技术挑战及解决办法分享,例如:性能优化,开发技巧,运维治理,压力测试,与其它生态技术的联合等。 MongoDB新性能利用实际包含不限于:update加强,unionWith,wildCardIndex,merge aggregate,Refinable Shard Keys,Compound Hashed Shard Keys,Hedged Reads,时序汇合,实时从新分片,版本化的API 等。 长按扫描二维码 进入文稿提交页面 【投稿要求】 内容不违反法律法规,规章及规范性文件;内容必须和MongoDB相干;内容必须为原创,严禁剽窃或洗稿;内容清晰易懂、信息详实精确、有深度;同一名作者投稿篇数不限,但雷同内容不能反复投稿,投稿内容未发表过;内容能够受权MongoDB中文社区渠道进行首发与宣传,如有先公布于其余渠道则勾销获奖资格。【征集流动流程及工夫节点】征集工夫:2021年10月13日-2021年11月30日 评审工夫:2021年12月1日-2021年12月12日 评审规范:针对公司或行业在数字化、智能化建设中的重点、难点问题提出的解决方案,在理念、办法、具体推动过程中有创新性;利用、教训、技巧具备代表性,对其余公司及行业倒退有启发、利用价值 评审专家: 唐建法,孔德雨,李丹,徐雷,陈亮亮,郭远威,唐卓章 颁奖工夫:2022年1月深圳·MongoDB中文社区年初大会现场 深度用户专访:2021年12月1日起 入库案例颁布:2021年12月12日后,社区网站和自媒体渠道等陆续公布相应,并汇编MongoDB案例库。 【报名及征询形式】 将文稿提交至本链接:https://sourl.cn/eXwU57 长按扫描二维码 进入文稿提交页面 可增加社区助理小芒果(微信ID:mongoingcom)进行征询。 长按扫描二维码 增加小芒果微信获取免优惠码 往期征集文章示例:2020最佳案例分享 | MongoDB读写拆散异样案例剖析 2019年最佳案例分享 | OPPO百万级高并发MongoDB集群性能数十倍晋升优化实际 获奖文章分享 | MongoDB技术从0到1+ 获奖文章分享 | MongoDB GridFS 怎么用 【处分及激励设置】为什么加入案例征集: 大会将邀请MongoDB专家进行评审,为入围者颁发证书和奖品,为所有加入征集流动的用户提供小礼品一份; 收录到MongoDB中文社区发表,案例推送曝光,为企业和个人用户提供案例展现位; 最佳利用案例获得者将邀请到技术大会现场分享,加入案例征集的入围成员组建VIP交换群,在应用MongoDB过程遇到问题优先取得社区专家的反对,并在社群提供交流学习和单干反对。 奖项设置: 最佳利用案例 1名: 华为Matepad11平板电脑 +MongoDB中文社区礼包+ 奖杯 优良案例3名:ikbc无线机械键盘 + MongoDB中文社区礼包+ 获奖证书 入围案例若干名:MongoDB中文社区礼包 + 获奖证书 MongoDB中文社区礼包内含:MongoDB定制背包+ 马克杯 + 合作伙伴礼品盲盒,平板电脑和机械键盘可兑换成京东购物券;所有获奖与入围的敌人都将邀请进入MongoDB外围用户交换群,问题与交换将取得优先响应,并享有更多交流学习与展现机会。 ...

October 26, 2021 · 1 min · jiezi

关于mongodb:mongo-flowcontrol引发的问题

mongo flowcontrolmongo正本集部署时,mongo写入默认写入majority。如果从节点落后太多或者有挂掉的正本,呈现如果数量达不到正本集数据的一半以上(majority),mongo会被动的呈现flowcontrol的流量管制。查看集群的flowControl配置db.admin.runCommand(getParameters: "*"); // 获取mongodb所有的配置参数。mongo status "flowControlDecayConstant" : 0.5,"flowControlFudgeFactor" : 0.95,"flowControlMaxSamples" : 1000000,"flowControlMinTicketsPerSecond" : 100, //最终影响速度的参数,每秒最低100张tickret"flowControlSamplePeriod" : 1000,"flowControlTargetLagSeconds" : 10,"flowControlThresholdLagPercentage" : 0.5,"flowControlTicketAdderConstant" : 1000,"flowControlTicketMultiplierConstant" : 1.05,"flowControlWarnThresholdSeconds" : 10,flowcontrol的慢日志模式mongo仲裁节点部署破绽线上为了节约服务器资源,采取的一主一从一仲裁的办法部署正本集,因为mongo的从节点内存过大,被内核杀掉,导致了集群只剩下了主节点和仲裁节点。因为仲裁节点只参加投票。导致集群的写入只有一个节点(主节点)。小于majority(2)。导致整个集群呈现flowcontrol。重大影响mongo服务的性能。

October 18, 2021 · 1 min · jiezi

关于mongodb:MongoDB中文社区-Freetalk一起来玩快闪

近期,MongoDB中文社区将推出Freetalk系列,每期 5-15分钟,为宽广社区用户敌人提供一个快闪舞台!不论您是社区成员和contributors,还是社区普通用户,不论您是MongoDB深度用户还是刚入门,这里欢迎您来分享Freetalk或建言献策! MongoDB中文社区 Freetalk 系列蕴含什么内容? 社区外围用户组成员及contributors分享;社区用户发动的话题/分享申请;社区不定期策动:问答精选,专题,采访;也不时会分享:MongoDB相干招聘信息,书籍举荐,时事评论等。社区用户如何一起来玩 Freetalk ? 您能够发动话题分享申请:https://sourl.cn/QdDigu 也能够间接发动话题邀请,咱们将评估并颁布相应话题,并在社区寻找敌人来分享;一些主题探讨的流动,能够申请在线连麦;更多玩法,咱们一起摸索!MongoDB中文社区B站主页: https://space.bilibili.com/15... 您能够在B站上获取系列MongoDB培训视频。近期MongoDB中文社区微信及抖音视频号已开明,欢送关注! 福利来了!2021年10月16号前提交话题分享申请的敌人,咱们将随机抽取5名幸运儿送出MongoDB定制T恤或马克杯!

October 11, 2021 · 1 min · jiezi

关于mongodb:MongoDB部署集合文档索引的基本操作

MongDB入门官网下载地址 部署数据库、汇合、文档的基本操作索引1 单机部署下载、解压、配置启动数据库连贯数据库1.1 Windows下启动下载后解压至本地在解压后文件里创立一个目录用于存储数据文件 data/db 形式1:命令行参数形式启动服务 在bin目录中执行如下命令: mongod --dbpath=..\data\db默认端口27017,能够通过port指定端口 能够将bin目录设置到环境变量path中,方便使用一些命令 形式2:配置文件形式启动服务新建config文件夹,在文件夹下新建配置文件mongod.config storage: #The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows. dbPath: F:\mongodb-5.0.2\data\db在bin下执行 mongod -f ../config/mongod.config或mongod --config ../config/mogod.config默认端口27017在部署我的项目时,应用这种办法,有具体的参数1.2连贯数据库1.2.1 Shell连贯(mongo命令)在bin下新关上一个shell窗口连贯 mongo或mongo --host=localhost --port=27017查已有数据库 >show databases退出mongodb exit更多参数 mongo --helpMongoDB javascript shell 是一个基于JavaScript的解释器,反对js程序1.2.2 Compass图形化界面的应用下载地址抉择社区版填入ip与端口号 间接连贯即可 1.3 Linux下启动与连贯数据库将下载的linux版本的MongoDB拷贝到服务器 下载、解压、挪动 sudo susudo yum install libcurl opensslwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.2.tgztar -xvf mongodb-linux-x86_64-rhel70-5.0.2.tgzmv mongodb-linux-x86_64-rhel70-5.0.2 /usr/local/mongodb新建目录,存储数据和日志 #数据存储mkdir -p /mongodb/single/data/db#日志存储mkdir -p /momgodb/single/log新建配置文件 vi /mongodb/single/mongod.config配置文件 systemLog:#MongoDB发送所有日志输入的指标指定文件##The path of the log file to which mongod or mongos should send all diagnostic logging informationdestination: file#mongo或mongos应向发送所有诊断日志记录信息的日志文件门路path: "/mongodb/single/log/mongod.log"#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的开端logAppend: truestorage:#mongod实例存储数据的目录 storage.dbPath设置仅应用于mongd##The directory where the mongod instance stores its data.Default Value is "/data/db".dbPath: "/mongodb/single/data/db"journal: #启用或禁止持久性日志以确保数据文件放弃无效和可复原 enabled: trueprocessManagement:#启用在后盾运行mongos或mongod过程的守护过程模式fork: truenet:#服务实例绑定的IP,默认是localhostbindIp: localhost,172.19.18.168#bindIP局域网IP - ifconfig#绑定端口,默认为27017port: 27017备用 ...

September 13, 2021 · 2 min · jiezi

关于mongodb:mongodb内存占用过高

官网文档对于内存应用的阐明https://docs.mongodb.com/v4.2... 从 MongoDB 3.4开始, 占用的内存最大是: (电脑内存-1/2) Starting in MongoDB 3.4, the default WiredTiger internal cache size is the larger of either: 50% of (RAM - 1 GB), or256 MB. 比方我电脑是16g内存,MongoDB最大会占用 7.5gb,太恶心了 要害是应用 mongodump和mongorestore 也会占用大量内存,也不开释 批改配置咱们能够通过批改配置来限度mongodb应用的内存大小https://docs.mongodb.com/v4.2... 留神配置项的层级是:storage.wiredTiger.engineConfig.cacheSizeGB storage: ...其余配置... wiredTiger: engineConfig: cacheSizeGB: 3批改前,我应用mongorestore,内存占用了6g左右,批改后,内存只占用了3g,亲测无效

September 7, 2021 · 1 min · jiezi

关于mongodb:mongoDB-基本使用

mongoDB 根本应用进入mongodb mongo查看所有数据库 show dbs查看以后处于哪个数据库的环境 db切换/创立数据库 use demo删除数据库 db.dropDatabase()创立汇合 db.createCollection("user")查看以后数据库下的汇合 show collections删除汇合 db.user.drop()插入数据(没有对应的汇合会间接生成汇合) db.user.insert({"name": "liang"})db.user.insert({"name": "li"})查看全副数据 db.user.find()查看特定条件数据 db.user.find({"name": "liang"})查看多少条数据 db.user.find().limit(1)跳过多少条数据查看多少条数据(可做分页查问) db.user.find().skip(1).limit(1)and查问 db.user.find({"name": "liang", "age": 23})or查问 db.user.find({$or:[{"age": 23}, {"name": "liang"}]}) 大于查问 db.user.find({"age": {$gt: 23}}) 大于等于查问 db.user.find({"age": {$gte: 23}}) 小于查问 db.user.find({"age": {$lt: 23}}) 小于等于查问 db.user.find({"age": {$lte: 23}}) 更新数据(局部更新) db.user.update({"name": "li"}, {$set: {"age": 34}})更新数据(整个替换) db.user.update({"name": "li"}, {"age": 34})删除数据(局部删除) db.user.remove({"name": "liang"})删除数据(全副删除) db.user.remove({})清空控制台 cls退出mongodb exit

September 1, 2021 · 1 min · jiezi

关于mongodb:MongoDB-Builtin-Roles

Built-in Roles角色分类具体角色Database User Rolesread,read-write(every database have)Database Administration Roles¶dbAdmin, dbOwner , userAdmin (every database have)Cluster Administration RolesclusterAdmin,clusterManager,hostManager (admin database have)Backup and Restoration Rolesbackup,restore (admin database hava)All-Database RolesThe following roles are available on the admin database and provide privileges which apply to all databases except local and config: readAnyDatabase,readWriteAnyDatabase,userAdminAnyDatabase,dbAdminAnyDatabase (admin database have)Superuser Roles:root (Several roles provide either indirect or direct system-wide superuser access) (admin database have)Internal Role__system¶ (system have)依据下面的这张表尝试了解上面语句的含意 A role can inherit privileges from other roles in its database. A role created on the admin database can inherit privileges from roles in any database. ...

August 19, 2021 · 2 min · jiezi

关于mongodb:MongoDB认证开启免费活动还有大礼包可以领

MongoDB认证分两类:DBA认证和开发者(Developer)认证。取得MongoDB认证的开发人员和DBA,是MongoDB官网认可的具备构建和保护MongoDB应用程序所需常识的专业人士。官网认证,寰球可查。 即日起至2021年11月30日,凡报名并参加考试的MongoDB爱好者,若能胜利取得认证,可到MongoDB官网报销当次认证考试费用,并额定取得MongoDB派发的大礼包一份!点击扫描下方二维码或点击“浏览原文”查看流动规定理解详情。长按扫码,理解详情 怎么报名? 如何筹备? 找谁报销? 大礼包里都有什么? 是不是感到既兴奋又有很多问号? 想打消这些疑难就来 8月19日星期四下午2:00 MongoDB 认证流动答疑会 咱们将在认证交换群中公布会议登录链接,入群请增加小芒果微信(微信ID:mongoingcom)并备注“认证”。MongoDB-寰球当先的古代通用数据库点击拜访MongoDB官网www.mongodb.com/zhTapdata DaaS - 一站式实时数据服务平台 (tapdata.net)Tapdata Cloud - 收费在线异构数据库实时同步工具(cloud.tapdata.net) Mongoing中文社区 MongoDB中文社区微信公众号 扫描关注,获取更多精彩内容 社区网站www.mongoing.com

August 19, 2021 · 1 min · jiezi

关于mongodb:技术分享-基于-mongo-cluster-的-PITR-恢复案例一则

作者:任坤 现居珠海,先后负责专职 Oracle 和 MySQL DBA,当初次要负责 MySQL、mongoDB 和 Redis 保护工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 1 背景网上基于 mongo 单实例 PITR 的案例比拟多,官档也有对于mongo cluser 的复原步骤,但于基于 mongo cluster 的 PITR 案例简直没有。本文基于试验环境,模仿线上环境实现一次针对 mongo cluster 的 PITR 。 原集群实例散布状况: 172.16.129.170 shard1 27017 shard2 27018 config 37017 mongos 47017172.16.129.171 shard1 27017 shard2 27018 config 37017 mongos 47017172.16.129.172 shard1 27017 shard2 27018 config 37017 mongos 47017思考到线上环境的理论数据会比拟大,这里只将 shard 复原成单实例,能供开发查问数据即可。 复原后的实例散布状况: 172.16.129.173 shard1 27017 shard2 27018 config 37017 mongos 47017172.16.129.174 config 37017172.16.129.175 config 37017mongo 版本为 percona 4.2.13,对每个 shard 实例和 config server 都部署 hot backup 定时备份脚本,同时对每个 shard 实例和 config server 部署 oplog 定时备份脚本。 构建测试数据,通过 mongos 登录集群,创立一个 hash 分片表并插入10条数据: ...

July 20, 2021 · 4 min · jiezi

关于mongodb:mongodb-geoNear-使用记录

须要,查问一个坐标点的左近地位 数据格式能够用数组或者geojson的模式 <field>: [ <x>, <y> ]<field>: [<longitude>, <latitude> ]GeoJSON location: { type: "Point", coordinates: [-73.856077, 40.848447]}先列出经度,而后再列出纬度 比方 loc 字段 { "city": "北京市", "geo_id": 565932, "geo_name": "万柳园(长春堂药店)", "lat": 39.850201868495773283, "lng": 116.33426020654366084, "loc": "[116.33426020654366084,39.850201868495773283]", "status": 0 }索引创立 2dsphere 索引 2dsphere索引反对查问球面几何实体对象 db.collection.createIndex( { <location field> : "2dsphere" } )pymongo查问例子 lng = geo['lng'] lat = geo['lat'] result = geos_collection.aggregate([ {"$geoNear": { "near": { "type": "Point", "coordinates": [lng, lat] }, "distanceField": "distance", "maxDistance": 2000, "query": {"status": -1}, "spherical": True } }, {"$limit": 10} ])mongodb shell ...

July 3, 2021 · 1 min · jiezi

关于mongodb:Mongo-服务重启异常问题记录

本文集体博客地址:https://www.leafage.top/posts/detail/21628W63S 当初公司的服务器经常性断电,所以要经常性重启所有的服务,然而这些redis、mysql、mongo等服务中,mongo经常性呈现重启失败的状况,依据之前的教训和网络上帖子的信息,这里记录一下总结; 首先阐明一下,这里装置的服务都是通过yum 或者 apt 装置的,这是我始终举荐和应用的操作,因为这样装置整洁、该放什么类型的文件到哪个目录下都是一样的(如:/var/log/xxx/xxx.log)报错次要问题如下: [root@localhost mongo]# systemctl status mongod● mongod.service - MongoDB Database Server Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since 一 2021-06-28 14:32:51 CST; 6s ago Docs: https://docs.mongodb.org/manual Process: 3351 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=1/FAILURE) Process: 3348 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS) Process: 3345 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS) Process: 3343 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)6月 28 14:32:51 localhost systemd[1]: Starting MongoDB Database Server...6月 28 14:32:51 localhost mongod[3351]: about to fork child process, waiting until server is ready for connections.6月 28 14:32:51 localhost mongod[3351]: forked process: 33546月 28 14:32:51 localhost mongod[3351]: ERROR: child process failed, exited with 16月 28 14:32:51 localhost mongod[3351]: To see additional information in this output, start without the "--fork" option.6月 28 14:32:51 localhost systemd[1]: mongod.service: control process exited, code=exited status=16月 28 14:32:51 localhost systemd[1]: Failed to start MongoDB Database Server.6月 28 14:32:51 localhost systemd[1]: Unit mongod.service entered failed state.6月 28 14:32:51 localhost systemd[1]: mongod.service failed.看到异样的产生,并不能从其中获取到十分无效的信息,那就先去看下日志,在日志文件中能够看到一些有用的信息(这里没有及时记录截图,就先不放代码或截图了) ...

June 28, 2021 · 1 min · jiezi

关于mongodb:技术分享-mongo-集群连接数暴涨处理案例一则

作者:任坤 现居珠海,先后负责专职 Oracle 和 MySQL DBA,当初次要负责 MySQL、mongoDB 和 Redis 保护工作。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 1 背景6月5号22:30左右收到几条报警短信,线上某 mongo 集群的 shard2 呈现了主从提早,过了几分钟主动复原。 原本想伪装没看见,可是过了一会又报警主从提早,尽管这次也是主动复原,然而不下来看一下心里有点不虚浮。 这套环境为3.4集群,3 mongos + 4 shard(1主2从),主节点 priority=2 ,其余节点 priority=1 ,当网络畅通时确保主库永远在1节点。 2 排查登录grafana查看主库的监控信息,这一时间段cpu和内存使用率显著回升 qps 在22:30左近线性降落为 0 连接数却继续暴涨 由此能够大抵推断是连贯风暴导致主库压力过大进而引发主从复制提早,具体信息须要查看 mongod.log 。mongo 日志文件的益处是记录信息十分具体,害处是记录信息太多导致文件占用空间很大。为此 mongo 提供了专门的切换日志指令,但该指令只负责切换不负责清理历史日志文件,并且 mongo 本身不能设置 job 以实现定期主动切换,为此须要独自编写脚本。 创立1个具备 hostManager 角色的 mongo 账号 backup ,编写如下一个 shell 脚本,每小时执行1次。 [root@ mongod]# more logrotate_mongo.sh#!/bin/shMONGO_CMD=/usr/local/mongodb/bin/mongoKEEP_DAY=7#flush mongod logdatadir=/data/mongodbport=27017role=mongoddestdir=/data/backup/mongolog/${role}if [ ! ‐d "${destdir}" ]; then mkdir ‐p ${destdir}fi$MONGO_CMD ‐‐authenticationDatabase admin admin ‐ubackup ‐p"*****" ‐‐eval"db.runCommand({logRotate:1})" ‐‐port $portmv ${datadir}/mongod.log.????‐??‐??T??‐??‐?? ${destdir}/find $destdir ‐name "mongod.log.*" ‐mtime +${KEEP_DAY} ‐exec rm ‐rf {} \;归档的日志文件如下,22:00-23:00时间段生成的日志量比平时多出1个量级,由此也能够反向推断出 mongo 在这段时间压力有异样。 ...

June 22, 2021 · 2 min · jiezi

关于mongodb:mysql-ghost导致自增id重复

mysql表变更gh-osh相比pt-online-schema-change稳固,但应用过程也存在问题: 导致自增重置 业务表id字段自增,同时会有delete,如果应用gh-ost之前刚刚进行了delete操作,间接导致表id自增重置(成果同8.0以下版本,mysql服务器重启)表拜访频繁更新 频繁更新产生的锁,失最初一步重试几次后失败,从而过程敞开,生成两头表_gho和_ghc也没有删除本文由博客一文多发平台 OpenWrite 公布!

June 21, 2021 · 1 min · jiezi

关于mongodb:mongo变更数据类型

mongo写入加了引号,导致一些数值字段都是string类型,批改字段类型为数值型。 db.Report99.find().forEach( function(doc){ db.Report99.update({'_id': doc._id},{$set:{"begin-quantity": parseFloat(doc["begin-quantity"])}}); //改为浮点数 db.Report99.update({'_id': doc._id},{$set:{"end-quantity": NumberInt(doc["end-quantity"])}}); // 改为整型 });mongo4.2+版本,可参数如下形式: db.getCollection("my-report").update( { "begin-quantity": { $type: "string" } }, [{ $set: { "begin-quantity": { $convert: { input: "$average-quantity", to: "double" } } } }], //无效类型: string|bool|int|long|double|decimal|date|timestamp|objectId ... { multi: true })阐明:1、如果汇合名蕴含特殊字符,应用db.getCollection('my-report')2、forEach中doc取某个字段值可间接doc.key,如果key中蕴含特殊字符,应用doc[''] 本文由博客一文多发平台 OpenWrite 公布!

June 21, 2021 · 1 min · jiezi

关于mongodb:mongodb-宝塔线上配置

最近想要用node和mongodb写一个集体博客的后盾接口,在本地测试没有问题当前就想部署到线上试试。 1.在宝塔的软件商店中装置mongodb 2.配置连贯外网设置监听端口为0.0.0.0,原来的是127.0.0.1只容许本地拜访,当初变成容许外网拜访 在宝塔的【平安】配置项中,放行27017端口 在腾讯云【治理控制台】中的防火墙中增加规定,容许27017端口出入。 3.配置账号密码进入mongodb装置目录,上面是宝塔面板的默认目录 cd /www/server/mongodb/bin 输出命令行mongo,进入mongodb环境 mongo 为admin数据库设置账号密码 切换到 admin 数据库 use admin设置用户和明码 db.createUser({user:'root',pwd:'admin_mima',roles:['root']})验证是否增加胜利,db.auth(用户名,用户明码) db.auth('root', 'admin_mima')为其余数据库设置账号和明码 切换到 myblog 数据库 use myblog设置用户和明码 db.createUser({user:'test',pwd:'123456',roles:['readWrite']})验证是否增加胜利,db.auth(用户名,用户明码) db.auth('test', '123456')4.开启平安登入authorization由disable改为enable 5.我的项目中的设置我的项目地位 批改后盾我的项目连贯数据库配置 启动后盾我的项目下载并启动PM2管理器 增加运行我的项目 6.测试 解决宝塔mongodb无奈启动问题:在宝塔命令行进入mongodb目录cd /www/server/mongodb/bin输出命令:mongod 问题解决,起因不明

May 20, 2021 · 1 min · jiezi

关于mongodb:MongoDB-备份和还原数据库

备份mongodump --host=mongodb.example.net --port=27017 --username=user --password="pass" --authenticationDatabase=test --db=test --collection=myCollection --oplog --out=/opt/backup/test-2013-10-24--host:默认 localhost:27017 ,指定连贯主机--port:默认 27017 ,指定连贯端口--username:指定进行身份验证的用户名--password:指定进行身份验证的明码--authenticationDatabase:指定进行身份验证的数据库,如果未指定,则假如为导出的数据库--db:指定要备份的数据库,默认为所有数据库--collection:指定要备份的汇合,默认为所有汇合--oplog:创立一个 oplog.bson 文件作为备份的内容,蕴含 mongodump 备份操作期间产生的操作日志。--oplog 不能与 --db 和 --collection 一起应用,必须创立残缺的转储才能够应用。--out:默认当前目录下的 dump 目录,指定备份保留的目录。应用"-"代替门路能够发送到规范输入。--out 不能与 --archive 一起应用。还原mongorestore --host=mongodb1.example.net --port=3017 --username=user --password="pass" --authenticationDatabase=test_bak --oplogReplay --drop /opt/backup/test-2013-10-24/--host:默认 localhost:27017 ,指定连贯主机--port:默认 27017 ,指定连贯端口--username:指定进行身份验证的用户名--password:指定进行身份验证的明码--authenticationDatabase:指定进行身份验证的数据库--oplogReplay:复原数据库转储后,从bson文件从新执行oplog内容。--oplogReplay 不能与 --db --collection --nsInclude --nsExclude 一起应用,必须还原残缺的转储才能够应用。--drop:还原汇合之前,从指标数据库中删除汇合。

May 12, 2021 · 1 min · jiezi

关于springboot:个人学习系列-Spring-Boot-整合-MongoDB-实现数据增删改查

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中性能最丰盛,最像关系数据库的。MongoDB装置因为我是简略整合一下,所以是将MongoDB装置到windows中。 1. 官网下载安装包进入下载页面后间接在左边就能够看到下载链接,选好本人要下载的版本平台点击下载即可。 2. 间接傻瓜式装置2.1 选残缺装置,自定义装置大佬随便。 2.2 地址和装置形式抉择 2.3 可视化工具抉择 2.4 装置结束 3. 上手写代码3.1 先用Navicat连贯上MongoDB连贯上发现什么都没有,不必管,间接撸代码。 3.2 新建Spring Boot我的项目这里不赘述如果用IDEA新建我的项目了哈。 3.2.1 pom.xml文件<!-- web服务 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><!-- mongodb依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency><!-- lombok依赖 --><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId></dependency>3.2.2 application.yml文件spring: data: mongodb: uri: mongodb://localhost:27017/test # mongodb连贯地址3.2.3 User.java实体类@Datapublic class User implements Serializable { /** * id主键 */ private Integer id; /** * 用户名 */ private String name; /** * 年龄 */ private Integer age;}3.2.4 UserRepository.java MongoDB操作类Spring Data Mongodb提供一套快捷操作 mongodb的办法,创立Dao,继承MongoRepository,并指定实体类型和主键类型。 ...

April 23, 2021 · 1 min · jiezi

关于mongodb:Mongoose在Schema中使用get修饰符格式化日期时间无效的一种情况

Mongodb数据库存储工夫的格局是ISO格局的,与北京工夫有8个小时的时区差,所以在理论应用过程中往往须要对数据库中取出的工夫进行格式化。 moment.js是一个很好用的日期解决方面的类库,@官网具体的应用形式如下: const UserSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true }, password: { type: String, required: true }, email: String, create_time: { type: Date, default: Date.now, get: v => moment(v).format('YYYY-MM-DD HH:mm:ss') // 这里大写的HH是24小时制,小写的hh是12小时制 }});但在配合mongoose应用时遇到了一个坑,尽管应用办法是正确的,但前台从后盾拿到的JSON里的日期却还是数据库中未经格式化的原始数据,也就是说写在schema中的日期格式化代码如同并没有失效。 一开始始终认为是moment或者Schema哪里写的有问题,但试着在接口返回数据之前输入了一下,后果输入的日期却是格式化好了的,这就很奇怪了。 起初又搜寻了半天起因之后才得悉,是Schema差了一个属性,这里须要这样设置 UserSchema.set('toJSON', { getters: true });如果不这样设置的话,返回的JSON是不会触发Schema中的get修饰符的,这也就导致了后盾返回的后果里仍旧是格式化之前的日期。

April 20, 2021 · 1 min · jiezi

关于mongodb:MongoDB聚合aggregate常用操作及示例

简介MongoDB 中聚合(aggregate)次要用于解决数据(诸如统计平均值,求和等),并返回计算后的数据后果。 有点相似 SQL 语句中的 count(*)。 罕用操作表达式形容$match用于过滤数据,只输入符合条件的文档。$match应用MongoDB的规范查问操作。$project批改输出文档的构造。能够用来重命名、减少或删除域,也能够用于创立计算结果以及嵌套文档。$limit用来限度MongoDB聚合管道返回的文档数。$skip在聚合管道中跳过指定数量的文档,并返回余下的文档。$unwind将文档中的某一个数组类型字段拆分成多条,每条蕴含数组中的一个值。$group将汇合中的文档分组,可用于统计后果。$sort将输出文档排序后输入。$lookup联表查问$geoNear输入靠近某一地理位置的有序文档。$facet/$bucket分类搜寻(MongoDB 3.4以上反对)  示例$match//查问条件 以某个分组查问 (能够多个查问条件累加到match外面)db.getCollection('doc_views').aggregate([ { $match: { "orgName" : "前端技术部" } }])//查问后果如下/* 1 */{ "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"), "__v" : 0, "time" : "2020-11-11", "docName" : "testPublishAll", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "count" : 3}...$project//删减字段db.getCollection('doc_views').aggregate([ { $match: { "orgName" : "前端技术部" } }, { $project: { docName: true, orgName: true } }])//查问后果如下 只显示设置为true的字段/* 1 */{ "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"), "docName" : "testPublishAll", "orgName" : "前端技术部"}...//定义别名 把orgGroup指定指定成count字段db.getCollection('doc_views').aggregate([ { $match: { "orgName" : "前端技术部" } }, { $project: { docName: true, orgName: true, orgGroup: "$count" } }])//查问后果orgGroup字段展现count的值/* 1 */{ "_id" : ObjectId("5fcb2c6cdfebd2682b2ae01b"), "docName" : "testPublishAll", "orgName" : "前端技术部", "orgGroup" : 3}$group//聚合条件 _id :强制必须存在。 db.getCollection('doc_views').aggregate([ { $group: { _id: { name: "$docName", orgName: "$orgName" }, total: { $sum: "$count" } } } ])//1、_id: null _id为null的查问后果/* 1 */{ "_id" : null, "total" : 474}//2、_id: "$docName" _id为某字段/* 1 */{ "_id" : "gch-gitbook", "total" : 8}...//3、_id: { name: "$docName", orgName: "$orgName" } _id查问条件并为字段定义别名/* 1 */{ "_id" : { "name" : "vuepress-hjw-test", "orgName" : "前端技术部" }, "total" : 2}$sort、$skip、$limit//列表分页的时候个别三个联结应用来做数据分页//sort列表排序 skip指定跳过多少条 limit每次查问条数//skip的计算形式:(以后页码-1)*每页大小 如:(pageIndex - 1) * pageSizedb.getCollection('doc_views').aggregate([ {$sort: {_id: -1}}, {$skip:Number(100)}, {$limit:Number(10)} ])//查问后果如下/* 1 */{ "_id" : ObjectId("604ecc57b3b65a411b5600de"), "__v" : 0, "time" : "2021-02-25", "docName" : "abgFeedback", "docType" : "vuepress", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "count" : 1}/* 2 */{ "_id" : ObjectId("604ecc57b3b65a411b5600dd"), "__v" : 0, "time" : "2021-02-24", "docName" : "testtestdocs", "docType" : "docsify", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "count" : 1}$lookup//联表查问db.getCollection('doc_views').aggregate([ {$sort: {_id: -1}}, {$skip:Number(100)}, {$limit:Number(10)}, {$lookup:{ from: "docs", localField: "docName", foreignField: "name", as: "child" }}])//查问后果/* 1 */{ "_id" : ObjectId("604ecc57b3b65a411b5600de"), "__v" : 0, "time" : "2021-02-25", "docName" : "abgFeedback", "docType" : "vuepress", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "count" : 1, "child" : [ { "_id" : ObjectId("5f6da851a18a783210da7a16"), "docType" : "vuepress", "name" : "abgFeedback", "description" : "二手车问题反馈收集问题", "owner" : "gongchenghui", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "newGit" : false, "toTop" : ISODate("2020-11-20T02:41:33.742Z"), "realName" : "龚成辉", "dest" : "abgFeedback", "opendFiles" : [], "createTime" : ISODate("2020-09-25T08:20:33.373Z") } ]}$facet 分类查问//依据条件 分类一次查问出想要的数据和数据的总数db.getCollection('doc_views').aggregate([ {$match: {"orgName" : "前端技术部"}}, { $facet: { respData: [ {$sort: {_id: -1}}, {$skip:Number(100)}, {$limit:Number(1)}, ], total: [ { $count: "total" } ] } }//查问后果如下 /* 1 */{ "respData" : [ { "_id" : ObjectId("604ecc57b3b65a411b5600de"), "__v" : 0, "time" : "2021-02-25", "docName" : "abgFeedback", "docType" : "vuepress", "orgGroup" : "汽车事业群", "orgName" : "前端技术部", "count" : 1 } ], "total" : [ { "total" : 284 } ]}留神:此办法只能在3.4以上版本的数据库中应用,低版本的话还是做两次查问 ...

April 19, 2021 · 2 min · jiezi

关于mongodb:mongodb如何使用授权登录

前言mongodb默认是不须要受权登录的,这样在理论生产环境中是十分危险的一件事件,接下来就来讲一下如何开启平安受权拜访 1. 第一次登录不启动受权(默认就是不启动),咱们先来创立admin和root账号,他们是用来开启受权后操作用户,创立数据库等操作的use admindb.createUser({ user: "admin", pwd: "123456", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })db.createUser({user: "root",pwd: "123456", roles: [ { role: "root", db: "admin" } ]})2. 第二次登录开启受权./mongod --auth --dbpath=/home/db/data --logpath=/home/db/logs/mongodb.log3. 用admin账号登录db.auth("admin","123456");4. 创立咱们须要的数据库并增加权限use mydbdb.createUser({user: "mydb",pwd: "123456",roles: [ { role: "dbOwner", db: "mydb" } ]})附:权限阐明数据库用户角色:read、readWrite数据库治理角色:dbAdmin、dbOwner、userAdmin集群治理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager备份复原角色:backup、restore所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase超级用户角色:root

April 8, 2021 · 1 min · jiezi

关于mongodb:Mongodb在线修改oplog大小

MongoDB 3.6开始,能够应用命令replSetResizeOplog批改正本集成员的oplog大小,从secondary节点开始批改,而后顺次到主节点。本文测试环境为MongoDB 4.2。 能够通过命令查看oplog大小 handong1:PRIMARY> use localswitched to db localhandong1:PRIMARY> db.oplog.rs.stats().maxSizeNumberLong("5242880000")maxSize字段以字节为单位显示汇合大小,能够看到以后节点oplog大小为5242880000/1024/1024=5000MB。 接下来咱们批改正本集(一主一从一仲裁)各个成员的oplog大小。先批改secondary节点的oplog大小。 handong1:SECONDARY> use localswitched to db localhandong1:SECONDARY> db.oplog.rs.stats().maxSizeNumberLong("10485760000")handong1:SECONDARY> db.adminCommand({replSetResizeOplog: 1, size: 2000}){ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1617786418, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1617786418, 1)}handong1:SECONDARY> db.oplog.rs.stats().maxSizeNumberLong(2097152000)secondary节点oplog大小改为了2000MB。 而后批改primary节点的oplog大小。 handong1:PRIMARY> use localswitched to db localhandong1:PRIMARY> handong1:PRIMARY> db.oplog.rs.stats().maxSizeNumberLong("5242880000")handong1:PRIMARY> db.adminCommand({replSetResizeOplog: 1, size: 2000}){ "ok" : 1, "$clusterTime" : { "clusterTime" : Timestamp(1617786579, 1), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }, "operationTime" : Timestamp(1617786579, 1)}handong1:PRIMARY> db.oplog.rs.stats().maxSizeNumberLong(2097152000)能够看到primary节点oplog大小也批改为了2000MB。 ...

April 7, 2021 · 1 min · jiezi

关于前端:微信扫码关注登录前端vue与后端express代码

前言 随着时代的倒退,微信与咱们曾经是密不可分,微信也成为了一款必不可少的商业营销工具。除了咱们平时的微信聊天以外,微信也有很多的公众号,小程序,游戏等。优质的文章也会通过公众号推送给用户。所以这一章专门解说关注微信公众号来实现登录过程,让用户存在于本人的公众号这个流程池中。这里前端用vue,后端用express+mongodb来实现整个扫码登录过程。后端语言大家可依据本人的需要来更换。思路与步骤流程是一样的,上面会具体介绍。看完这篇文章起码能让你少走一周的弯路去钻研它。所有要留神的中央都用红色字标记。 一、微信扫码关注登录是什么? 微信扫码关注登录顾名思义,是指用户通过微信扫码,随后点击关注公众号之后即可主动登录到相干的网页或软件一个过程。如果曾经关注了,则扫码之后会主动实现登录。 二、为什么要应用微信扫码关注登录? 咱们都晓得微信登录,受权胜利之后即可实现登录。但咱们无奈获取到微信号或手机号等信息,只能获取到根本信息,如微信id,微信头像以及昵称。这样咱们就无奈与用户进行互动与交换。即便咱们本人的的网页做了更新或有了最新的优惠活动也无奈推送音讯给用户。所以目前大部分网站放弃了微信受权登录而开始应用扫码关注登录,这样用户人群都在本人的公众号里。也给本人的公众号带来大量的流量,有了这些流量,咱们就能够进行音讯推送,以及公众号营销。微信公众号营销办法很多种,如可在文章中插播广告,卖本人的课程等等。只有有流量,变现都不是问题。具体介绍如下微信扫码关注登录(vue+node+express+mongodb)

April 5, 2021 · 1 min · jiezi

关于前端:MongoDB数据库学习记录二

3.MongoDB增删改查操作3.1 创立汇合创立汇合分为两步,一是对汇合设定规定,二是创立汇合,创立mongoose.Schema构造函数的实例即可创立汇合。 // 设定汇合规定 const courseSchema = new mongoose.Schema({ name: String, author: String, isPublished: Boolean }); // 创立汇合并利用规定 const Course = mongoose.model('Course', courseSchema); // courses3.2 创立文档创立文档实际上就是向汇合中插入数据。分为两步: 创立汇合实例。调用实例对象下的save办法将数据保留到数据库中。 // 创立汇合实例 const course = new Course({ name: 'Node.js course', author: '', tags: ['node', 'backend'], isPublished: true }); // 将数据保留到数据库中 course.save();Course.create({name: 'JavaScript', author: '', isPublish: true}, (err, doc) => { // 谬误对象 console.log(err) // 以后插入的文档 console.log(doc)});Course.create({name: 'JavaScript', author: '', isPublish: true}) .then(doc => console.log(doc)) .catch(err => console.log(err))3.3 mongoDB数据库导入数据mongoimport –d 数据库名称 –c 汇合名称 –-file 要导入的数据文件找到mongodb数据库的装置目录,将装置目录下的bin目录搁置在环境变量中。 ...

April 2, 2021 · 2 min · jiezi

关于mongodb:MongoDB数据库学习记录一

1. 数据库概述及环境搭建1.1 为什么要应用数据库动静网站中的数据都是存储在数据库中的数据库能够用来长久存储客户端通过表单收集的用户信息数据库软件自身能够对数据进行高效的治理1.2 什么是数据库数据库即存储数据的仓库,能够将数据进行有序的分门别类的存储。它是独立于语言之外的软件,能够通过API去操作它。常见的数据库软件有:mysql、mongoDB、oracle。1.3 MongoDB数据库下载安装下载地址:https://www.mongodb.com/downl... 1.4 MongoDB可视化软件 1.5 数据库相干概念在一个数据库软件中能够蕴含多个数据仓库,在每个数据仓库中能够蕴含多个数据汇合,每个数据汇合中能够蕴含多条文档(具体的数据)。 术语解释阐明database数据库,mongoDB数据库软件中能够建设多个数据库collection汇合,一组数据的汇合,能够了解为JavaScript中的数组document文档,一条具体的数据,能够了解为JavaScript中的对象field字段,文档中的属性名称,能够了解为JavaScript中的对象属性1.6 Mongoose第三方包应用Node.js操作MongoDB数据库须要依赖Node.js第三方包mongoose应用npm install mongoose命令下载1.7 启动MongoDB在命令行工具中运行net start mongoDB即可启动MongoDB,否则MongoDB将无奈连贯。 1.8 数据库连贯应用mongoose提供的connect办法即可连贯数据库。 mongoose.connect('mongodb://localhost/playground') .then(() => console.log('数据库连贯胜利')) .catch(err => console.log('数据库连贯失败', err));1.9 创立数据库在MongoDB中不须要显式创立数据库,如果正在应用的数据库不存在,MongoDB会主动创立。

April 2, 2021 · 1 min · jiezi

关于前端:nodejsmongodb的那些事

一、mongodb简介mongodb是一个基于分布式文件存储的数据库,由c++语言编写,次要用于web利用提供可扩大的高性能数据存储解决方案。 mongodb是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中性能最丰盛,最像关系数据库的。它反对的数据结构十分涣散,是相似json的bson格局,因而能够存储比较复杂的数据类型。Mongo最大的特点是它反对的查询语言十分弱小,其语法有点相似于面向对象的查询语言,简直能够实现相似关系数据库单表查问的绝大部分性能,而且还反对对数据建设索引。 bson示例: {    name: "MongoDB",    type: "bson",    data: { id: 1, code: 123456 }}bson与json区别: ①更快的遍历速度bson会把数据长度存于头部,不便检索 ②操作更繁难批改某个数字,如从9变成10,数据长度产生了变动,所有的内容都要往后后移一位。bson则是能够指定数据列,批改的只是那一位数据列,然而如果数据由整型变成长整型,也是会导致数据变长的。 ③减少了额定的数据类型bson减少了byte array数据类型,不须要先转成base64在存成json。 分布式计算的长处:可靠性(容错) :分布式计算零碎中的一个重要的长处是可靠性。一台服务器的零碎解体并不影响到其余的服务器。 可扩展性:在分布式计算零碎能够依据须要减少更多的机器。 资源共享:共享数据是必不可少的利用,如银行,预订零碎。 灵活性:因为该零碎是非常灵活的,它很容易装置,施行和调试新的服务。 更快的速度:分布式计算零碎能够有多台计算机的计算能力,使得它比其余零碎有更快的处理速度。 开放系统:因为它是凋谢的零碎,本地或者近程都能够拜访到该服务。 更高的性能:相较于集中式计算机网络集群能够提供更高的性能(及更好的性价比)。 毛病:软件少,网络问题,安全性 什么是关系数据库关系型数据库,是指采纳了关系模型来组织数据的数据库,其以行和列的模式存储数据,以便于用户了解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查问来检索数据库中的数据,而查问是一个用于限定数据库中某些区域的执行代码。关系模型能够简略了解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。关系数据库:Oracle、DB2、MySQL、Microsoft SQL Server、Microsoft Access等 什么是非关系数据库指非关系型的,分布式的,数据以键值对的模式存储,构造不固定。严格意义上应该是一种数据结构化存储办法的汇合有余:只能存储简略的数据,不反对事物 二、mongodb的特点:1、面向汇合存储易存储对象类型的数据2、模式自在3、反对动静查问4、反对齐全索引等 三、mongodb数据模型monogoDB能够建多个数据库,每个数据库都有本人的权限和汇合,不同的数据库也搁置在不同文件中。 一个MongoDB 实例能够蕴含一组数据库,一个DataBase 能够蕴含一组Collection(汇合),一个汇合能够蕴含一组Document(文档)。一个Document蕴含一组field(字段),每一个字段都是一个key/value pair。 key: 必须为字符串类型。value:能够蕴含如下类型。● 根本类型,例如,string,int,float,timestamp,binary 等类型。● 一个document。● 数组类型。 四、nodejsnodejs是一个基于v8引擎的js运行环境,应用了事件驱动、非阻塞式 I/O 的模型,使其轻量又高效,V8 是为 Google Chrome 提供反对的 JavaScript 引擎的名称。 当应用 Chrome 进行浏览时,它负责解决并执行 JavaScript。v8有c++语言编写,是可移植的,且可运行于 Mac、Windows、Linux 和其余一些零碎 nodejs应用commonJs模块零碎 浏览器应用es5模块规范nodejs应用require() 浏览器应用import() nodejs+mongodb应用var mongoClient = require('mongodb').mongoClient;var url = 'mongodb://localhost:27017/runoob'mongoClient.connects(url, function() { if (err) throw err; var dbData = db.db('runoob'); // 创立汇合 dbData.createCollection('site', function() { db.close()// 敞开数据库 }) // 插入数据 var str = {name: "张三"}; dbData.collection('site').insertOne(str, function(err,data) { db.close() }) // 插入多条数据insertMany() var str2 = {$set: { "url" : "https://www.abc.com" }}; // str为查问条件 dbData.collection('site').insertMany(str, str2, function(){ db.close() }) // 查问数据find() // 查问指定数据find({name: "张三"}) // 更新数据updateOne() // 更新多条数据updateMany() // 删除数据deleteOne() // 删除多条数据deleteMany() // 排序sort(type) type = {type: 1}升序 -1 降序 // 分页find().limit(2) // 跳过find().skip(2) })

April 1, 2021 · 1 min · jiezi

关于文档型数据库:云图说|将源端MongoDB业务搬迁至华为云DDS的几种方式

摘要:华为云文档数据库服务DDS能帮您在业务须要时,疾速便捷的搬迁源端MongoDB业务上云。本文分享自华为云社区《云图说 | 第198期 将源端MongoDB业务搬迁至华为云DDS的几种形式》,原文作者:阅识风波 。 如果您因业务调整或须要应用华为云文档数据库DDS个性性能时,能够通过数据迁徙性能将原有MongoDB数据库的数据迁徙至华为云文档数据库。 云图说给大家带来了几种不同的形式,一起来学习下: 点击下方“理解更多”,文档数据库服务 DDS等着您! 点击关注,第一工夫理解华为云陈腐技术~

March 31, 2021 · 1 min · jiezi

关于前端:mongodb联表查询

数据库表表一: 数据记录表var mongoose = require('mongoose'), Schema = mongoose.Schema;var DocViewSchema = new Schema({ realName: String, //实在姓名 userName: String, //OA账号 count: Number, //文档统计 docName: String, //文档项目名称 docType: String, //文档我的项目类型 orgPath: String, //所属部门的组织门路 orgGroup: String, //所属事业群 orgName: String //所属小组 time: String,});module.exports = mongoose.model('Doc_view', DocViewSchema);表二:文档主表var mongoose = require('mongoose'), Schema = mongoose.Schema;var docsSchema = new Schema({ docType:String, //文档类型 user_name: String, //零碎用户 realName: String, //用户中文姓名 description: String, // 文档形容 gitUrl:String,//操作的文档源近程地址 displayName: String, //文档展现名 name:String,//文档名称 logo:String, owner:String,//文档创建人 developer:Array, //开发者 realName: String,//实在姓名 toTop:Date,//是否置顶 dest: String, //vuepress类型文档的输入目录 docKey: String, //束缚文档为public(公开)、private(公有)类型的关键字 privateMember: Array, //存储公有文档可查看的人员范畴 createTime: { type: Date, default: Date.now }, opendFiles:Array, orgName: String, //所属部门 orgPath: String, //所属部门的组织门路 orgGroup: String, //所属事业群 docCollection: Array, newGit: Boolean //标识是否是在零碎上构建的新我的项目});module.exports = mongoose.model('docs', docsSchema);表数据表一: 展现数据{ "_id" : ObjectId("603678000f6ec514b4b8d02f"), "__v" : 0, "time" : "2021-02-24", "docName" : "abgFeedback", "userName" : "zhangsan", "orgPath" : "******", "orgGroup" : "*****", "orgName" : "****", "realName" : "张三", "count" : 10}/* 42 */{ "_id" : ObjectId("603678000f6ec514b4b8d030"), "__v" : 0, "time" : "2021-02-24", "docName" : "bookgit", "userName" : "liuniu", "orgPath" : "******", "orgGroup" : "*****", "orgName" : "****", "realName" : "刘牛", "count" : 1}/* 43 */{ "_id" : ObjectId("603678000f6ec514b4b8d031"), "__v" : 0, "time" : "2021-02-24", "docName" : "testtestdocs", "userName" : "lisi", "orgPath" : "******", "orgGroup" : "*****", "orgName" : "****", "realName" : "李四", "count" : 1}/* 44 */{ "_id" : ObjectId("6037c9800f6ec514b4b8d03c"), "__v" : 0, "time" : "2021-02-25", "docName" : "abgFeedback", "userName" : "zhangsan", "orgPath" : "******", "orgGroup" : "*****", "orgName" : "****", "realName" : "张三", "count" : 10}表二:文档数据/* 45 */{ "_id" : ObjectId("5f6da851a18a783210da7a16"), "docType" : "vuepress", "name" : "abgFeedback", "gitUrl" : "*****/abgFeedback.git", "description" : "问题反馈收集问题", "owner" : "zhangsan", "orgGroup" : "*****", "orgName" : "*****", "orgPath" : "****", "logo" : "https://img.58cdn.com.cn/escstatic/fecar/pmuse/58doc/58logo.jpeg", "newGit" : false, "toTop" : ISODate("2020-11-20T02:41:33.742Z"), "realName" : "龚成辉", "dest" : "abgFeedback", "opendFiles" : [], "createTime" : ISODate("2020-09-25T08:20:33.373Z"), "developer" : [], "__v" : 0, "docCollection" : [], "docKey" : "private", "privateMember" : ["lisi"]}联表查问db.getCollection('doc_views').aggregate([ { $match: { time: { $gte: "2020-03-29", $lte: "2021-03-29" } } }, { $group: { _id: { "name": '$docName' }, total: { $sum: "$count" } } }, { $lookup: { from: "docs", localField: "_id.name", foreignField: "name", as: "child" } }, { $project: { "child._id": false, "child.gitUrl": false, "child.description": false, "child.orgGroup": false, "child.orgPath": false, "child.newGit": false, "child.toTop": false, "child.docCollection": false, "child.opendFiles": false, "child.createTime": false, "child.logo": false, "child.orgName": false, "child.owner": false, "child.realName": false, "child.__v": false, "child.privateMember": false, "child.developer": false, "child.name": false } },])$match 聚合匹配条件 这块是以doc_views表time字段匹配前端传入的起始工夫和截止时间段的所有数据$group 按某些指定的表达式对文档进行分组,而后将每个不同的分组的文档输入到下一阶段。输入文档蕴含一个_id字段,其中蕴含按关键字辨别的组 ...

March 31, 2021 · 3 min · jiezi

关于mongodb:Windows环境下安装MongoDB

1 下载安装文件下载地址:https://www.mongodb.com/try/download/community Note:目前官网最新版本是4.4.4,然而在Window 7操作系统上装置时,会提醒 MongoDB application is only supported on Windows 10/Windows 2016 or later 最初,在官网文档中找到解决办法。依据形容,Windows 7操作系统只能装置4.2及以前的版本。 2 装置MongoDB1、下载实现后,双击关上安装文件,点击“Next”; 2、勾选批准承受协定条款,点击“Next”; 3、 点击“Custom”进行自定义装置(Note:如果抉择Complete,就不能抉择装置门路); 4、 点击“Browse…”设置装置门路,设置实现后,点击“Next”; 5、 设置是否将MongoDB装置成为Windows服务(默认是勾选的),点击“Next”; 6、 此处不要勾选“Install MongoDB Compass”。勾选后,装置会十分耗时,能够在MongoDB装置实现后,去官网下载安装MongoDB Compass(装置阐明详见第3章),点击“Next”; 7、 点击“Install”进行装置。 3 装置MongoDB Compass下载地址:https://www.mongodb.com/try/download/compass 1、 下载实现后,双击关上安装文件,点击“Next”; 2、 批改装置门路,点击“Next”; 3、 点击“Install”进行装置。 4 开启MongoDB平安认证1、 关上MongoDB Compass,点击“Connect”链接MongoDB服务; 2、 链接胜利后,点击“Create Database”创立数据库,如下图。 3、 点击左下角“>_MongoSH Beta”创立用户Logger,命令如下: ...

March 30, 2021 · 1 min · jiezi

关于前端:mongoose数据查询orandwhere等用法

or为 $or 条件指定参数; //member = ["zhangsan", "lisi", "wangwu"];let filter = { $or: [ {docKey: "public"}, {owner: "zhangsan"}, {member: "lisi"} ]}db.getCollection('docs').find(filter);数据筛选or是或查问满足上面的条件其中之一就能够查问出相干数据如果数据库参数是数组,间接会从数组外面匹配是否蕴含相干数据 如上:memberand为 $and 条件指定参数; let filter = { $and: [ {docKey: "public"}, {owner: "zhangsan"} ]}db.getCollection('docs').find(filter);直译: docKey == "public" && owner == "zhangsan"须要满足枚举的两个条件能力筛选出相应数据; and与or联结应用let filter = { $or: [ { docKey: "public" }, { $and: [{docKey: "private"}, {$or:[{member: "zhangsan"}, {owner: "lisi"}]}] } ]}db.getCollection('docs').find(filter);直译: docKey == "public" || (docKey == "private" && (member.indexOf("zhangsan")>-1 || owner=="lisi"))wherelet filter = { $or: [ { docKey: "public" }, { $where: function(){ return this.docKey == "private" && (this.member.indexOf("zhangsan") > -1 || this.owner == "lisi"); } } ]}db.getCollection('docs').find(filter);直译: ...

March 26, 2021 · 1 min · jiezi

关于mongodb:mongodb常用命令4聚合及管道

1.应用聚合aggregate及管道group查问反复数据:首先我的数据库是这样的(存在很多反复数据):当初应用聚合aggregate查问反复数据: db.ss_tests.aggregate([{$group : {_id : "$id", count : {$sum : 1}}}])db.ss_tests.aggregate([{ $group: { _id: {id: '$id'},count: {$sum: 1}} }])两条语句是一样的。只不过一个间接输入value,一个减少了key值。 *语法解释:应用聚合aggregate函数查问,应用索引_id进行查问,将id雷同的应用管道$group将其分为一组,并应用sum计算一组的个数,将其赋值给count,输入 能够看到,我下面语句查问到的反复数据有的有20几条之多! 2.删除反复数据:办法一,应用聚合解决: db.ss_tests.aggregate([ { $group: { _id: '$id',count: {$sum: 1},multiples: {$addToSet: '$_id'}} }, { $match: {count: {$gt: 1}} }]).forEach(function(doc){ doc.multiples.shift(); db.ss_tests.remove({_id: {$in: doc.dups}});})*语法解释:1.应用聚合函数对ss_tests的id雷同的文档(document)进行分组,应用$sum进行计算统计id雷同的条数,并把条数赋值给count,应用$addToSet在返回后果中减少key为:multiples,value为:_id字段(因为聚合分组只会返回参加分组的字段);演示:(1)不实用addToset:db.ss_tests.aggregate([{ $group: { _id: {id: '$id'},count: {$sum: 1}} }])后果很清晰,没有多余的数据: { "_id" : { "id" : "3714" }, "count" : 2 }{ "_id" : { "id" : "3542" }, "count" : 1 }{ "_id" : { "id" : "3457" }, "count" : 24 }{ "_id" : { "id" : "3856" }, "count" : 23 }{ "_id" : { "id" : "3261" }, "count" : 4 }{ "_id" : { "id" : "3857" }, "count" : 23 }{ "_id" : { "id" : "3849" }, "count" : 1 }{ "_id" : { "id" : "3771" }, "count" : 23 }{ "_id" : { "id" : "3321" }, "count" : 24 }{ "_id" : { "id" : "2983" }, "count" : 24 }{ "_id" : { "id" : "4141" }, "count" : 23 }{ "_id" : { "id" : "4066" }, "count" : 23 }{ "_id" : { "id" : "3918" }, "count" : 23 }{ "_id" : { "id" : "3770" }, "count" : 23 }{ "_id" : { "id" : "3696" }, "count" : 24 }{ "_id" : { "id" : "3548" }, "count" : 24 }{ "_id" : { "id" : "3519" }, "count" : 24 }{ "_id" : { "id" : "3134" }, "count" : 24 }{ "_id" : { "id" : "3129" }, "count" : 24 }{ "_id" : { "id" : "3054" }, "count" : 24 }2.应用addToset的范例:单单是“_id:3054”的就有这么多数据,因为它会把每一个符合条件的“_id”退出对象中 ...

March 24, 2021 · 3 min · jiezi

关于spring:用WebMvcTest测试MVC-Web-Contorller二

原文 https://reflectoring.io/sprin...翻译: 祝坤荣浏览大概须要10分钟1. 校验匹配HTTP申请验证一个controller监听一个特定的HTTP申请很间接。咱们只有调用MockMvc的perform()办法并提供要测试的URL即可: mockMvc.perform(post("/forums/42/register") .contentType("application/json")) .andExpect(status().isOk());不只是校验controller会对一个特定的申请会有响应,这个测试也能够校验HTTP办法(这个例子是POST)与申请的content type是否正确。以上controller会回绝任何用了不同HTTP办法或content type的申请。 记住这个测试依然会失败,因为咱们的controller冀望一些入参。 更多匹配HTTP申请的内容能够在Javadoc MockHttpServletRequestBuilder中看到。 2. 校验输出为了校验入参被胜利的序列化成了Java对象,咱们须要在测试申请中提供它。输出能够是申请body(@RequestBody)里的JSON内容,一个URL中的变量(@PathVariable)或一个HTTP申请中的参数(@RequestParam): @Testvoid whenValidInput_thenReturns200() throws Exception { UserResource user = new UserResource("Zaphod", "zaphod@galaxy.net"); mockMvc.perform(post("/forums/{forumId}/register", 42L) .contentType("application/json") .param("sendWelcomeMail", "true") .content(objectMapper.writeValueAsString(user))) .andExpect(status().isOk());}咱们当初提供了门路变量forumId,申请参数sendWelcomeMail和controller冀望的申请body。申请body是用Spring Boot提供的ObjectMapper生成的,将UserResource对象序列化成了一个JSON字符串。 如果测试绿了,那么咱们就晓得了controller的register()办法能够将将这些HTTP申请的参数并将其解析成为Java对象。 3. 查看输出校验让咱们看下UserResource用@NotNull申明来回绝null值: @Testvoid whenValidInput_thenReturns200() throws Exception { UserResource user = new UserResource("Zaphod", "zaphod@galaxy.net"); mockMvc.perform(post("/forums/{forumId}/register", 42L) .contentType("application/json") .param("sendWelcomeMail", "true") .content(objectMapper.writeValueAsString(user))) .andExpect(status().isOk());}当咱们为办法参数减少了@Valid的申明后Bean测验会主动触发。所以,对于走乐观门路来说(比方让测验胜利),咱们在上一节创立的测试曾经足够了。 如果咱们想要测试一下测验失败的状况,咱们须要加一个测试用例,发送一个不非法的UserResouceJSON对象给controller.咱们冀望controller返回HTTP状态400(Bad request): @Testvoid whenNullValue_thenReturns400() throws Exception { UserResource user = new UserResource(null, "zaphod@galaxy.net"); mockMvc.perform(post("/forums/{forumId}/register", 42L) ... .content(objectMapper.writeValueAsString(user))) .andExpect(status().isBadRequest());}取决于这个校验对于利用有多重要,咱们能够为每个不非法的值加一个测试用例。这样能够疾速增加大量测试用例,所以你须要与团队阐明下你到底想要如何在你的我的项目里解决校验的测试。 ...

March 20, 2021 · 2 min · jiezi

关于mongodb:mongodb常用命令3数组匹配

mongon常用命令3--数组匹配1.mongon数组标签tag匹配例子:数据库是这样的: 我想要的是从我的tag标签返回搜寻到的关键词:(1)数组中单个匹配:(单个匹配,只有数组中含有这个关键字,那么都会返回) db.ss_tests.find({tag:'小学'} )后果:数据很芜杂,去一下不必要的字段:字段后加0,示意不显示。 db.ss_tests.find({tag:'小学'},{content:0,_id:0,id:0} )后果这样就很简洁了:(2)多个条件匹配: db.ss_tests.find( { tag:{$all: ['高中',"语文"]} },{content:0,id:0,_id:0} )运行后果:加了关键字$all,它会返回文档中符合条件的数组,只有蕴含高中,语文就会返回;而且会漠视数组中原本该关键字的程序,和数组是否存在其它元素。然而你如果这样匹配你的数据库: db.ss_tests.find( { tag: ['高中',"语文"] } )后果将会空白,返回没有什么,它的意思是查问所有数组元素为高中,语文的,然而只能蕴含高中,语文这两个关键字,其它不行,因为我数据库的标签都是三个元素的,所以无奈打印出后果: 官网文档存在加all与不加all的阐明,上面附上原阐明:不加all: 翻译:上面的这个例子会查问所有文档中的tags数组,这些数组必须蕴含确切的两个元素“red”和“blank”,并且程序也是特定的,就是即便存在有的文档含有red和blank,然而程序扭转,它也不会反馈给你。 加了all: 翻译:相同,如果你心愿找到的数组蕴含下面的这两个元素red和blank,然而疏忽其它元素是否存在,并且也疏忽它在数组中的程序,那么你能够应用 $all 这个运算符 -(2)待更……

March 18, 2021 · 1 min · jiezi

关于mongodb:CentOS7安装Mongodb并配置权限

1.下载1.本人抉择mongodb的寄存门路,我这里抉择寄存在 /usr下cd /usrwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgztar zxvf mongodb-linux-x86_64-4.0.0.tgzmv mongodb-linux-x86_64-4.0.0.tgz mongodb2.配置环境变量vi /etc/profile插入内容: export PATH=/usr/mongodb/bin:$PATH从新运行profilesource /etc/profile3.创立数据库配置文件、存储文件和日志文件cd /usr/mongodbtouch mongodb.confmkdir dbmkdir logcd logtouch mongodb.log4.编辑配置文件vi /usr/mongodb/mongodb.conf增加如下内容:systemLog: quiet: false path: /usr/mongodb/log/mongodb.log logAppend: false destination: fileprocessManagement: fork: true pidFilePath: /usr/mongodb/mongod.pidnet: port: 27017 bindIp: 0.0.0.0 maxIncomingConnections: 5 wireObjectCheck: true ipv6: falsestorage: dbPath: /usr/mongodb/db journal: enabled: truesecurity: authorization: enabled5.增加数据库角色1.启动mongodb mongod --config /usr/mongodb/mongodb.conf2.切换到admin数据库 use admin3.创立admin账号 db.createUser({user: "admin",pwd: "***",roles: [{role:"userAdminAnyDatabase",db: "admin"}]})如果须要创立一般角色,须要切换到指定数据库在创立角色。role局部权限: All build-in Roles Database User Roles: read|readWrite 数据库用户角色:读|读写 Database Admion Roles: dbAdmin|dbOwner|userAdmin 数据库治理角色:数据库管理员|数据库所有者|用户治理 Cluster Admin Roles: clusterAdmin|clusterManager|clusterMonitor|hostManager 集群治理角色: Backup and Restoration Roles: backup|restore All-Database Roles: readAnyDatabase|readWriteAnyDatabase|userAdminAnyDatabase|dbAdminAnyDatabase 所有数据库角色:读所有数据库|读写所有数据库|所有数据库的用户管理员|所有数据库的管理员 Superuser Roles: root6.带权限验证的形式启动数据库ps -ef | grep mongo而后应用 kill杀死过程带权限验证的形式启动数据库: mongod --auth --config /usr/mongodb/mongodb.conf7.配置开机自启动echo "mongod --auth --config /usr/mongodb/mongodb.conf" >> /etc/rc.local到此带权限验证的mongodb数据库就配置实现了。参考网站: ...

March 9, 2021 · 1 min · jiezi

关于mongodb:备份-docker-容器内的-mongo数据库

前言之前本人写了一个集体博客,整体技术栈为: Vue + node + mongo,之前就是一个小白,啥也不懂没有设置权限,也没有批改端口,也没有限度近程登录host...... 忽然有一天,发现数据全副没有了(被黑): 前面小白一直成长,摸索出了 jenkins + docker 实现了主动构建和部署,其中 mongo 被我部署进了 docker 容器 当初有个问题,我想定期的去备份数据,以备不时之需 人力备份什么叫人力备份,就是手工的把 mongo 容器内的数据备份,流程: 进入 mongo 容器,备份数据拷贝 mongo 容器的数据到宿主机机器1. mongo 容器内备份数据找到正在运行中的 mongo 容器,这里是 3dcf2168ed94 docker images 进入 mongo 容器 docker exec -it 3dcf2168ed94 sh 咱们新建一个备份目录,假如是 /root/blog 执行 mongodump 命令,导出 blog 整个数据库到当前目录 # 导出 blog 数据库 到当前目录mongodump -h localhost:27017 -d blog -o ./ 能够看到,曾经胜利备份了容器的数据,咱们退出,回到宿主机器 exit2. 拷贝容器数据到宿主机执行命令: # 拷贝 3dcf2168ed94容器内的 /root/blog => 当前目录(宿主机器)docker cp 3dcf2168ed94:/root/blog ./ ...

March 8, 2021 · 1 min · jiezi

关于mongodb:利用ssh正向代理和mongodump实现远程定时备份mongodb数据库

最近在应用nodejs,express,mongodb做一些后端我的项目,数据量不是很大,最开始在数据库备份这一块抉择在主目录创立一个dump文件夹,程序启动时开启一个定时工作,每天凌晨1点mongodump一下以后的数据库。但总放心以后服务器硬盘坏了怎么办,我的数据不就没了?所以有了一个想法:在另一台服务器上也去定时备份我的我的项目服务器上的数据库。mongodump自身有着弱小的性能,能够近程备份数据库: mongodump -h 远端IP地址 -u 登录用户 -p 登录明码 -d 数据库名 --port 远端mongod端口(默认27017) -o 输入到本机的门路然而当初企业中服务器都是通过ssh去登录拜访的,mongodump提供了用户名明码的形式但没有提供应用ssh拜访的性能配置,所以这是我要解决的问题。 咱们晓得ssh命令除了登陆外还有三种代理性能:正向代理(-L)、反向代理(-R)、socks5 代理(-D),在这里咱们能够应用正向代理来代理到咱们本机的某个端口,而后再mongodump本机不就实现我的目标了吗? ssh -L :本机代理端口:localhost:近程mongod过程端口 近程登录用户名@近程服务器地址这里的本机指的也是一个服务器,因为我要写一个专门用来备份的nodejs利用,并部署到一个备份服务器上。 我的项目目录如下: ├─dump //数据库寄存目录├─app.js //服务器启动├─config.js //配置文件├─cronFunc.js //定时工作├─init.js //初始化性能├─mongodump.js //备份数据库├─sslProxy.js //ssh正向代理├─util.js //工具函数├─package.json├─README.md├─server.json我的项目中一共应用了3个包: "dependencies": { "express": "^4.17.1", //启动服务 "node-cmd": "^4.0.0", //调用零碎终端执行命令 "node-cron": "^2.0.3" //开启定时工作 }配置文件// config.jsmodule.exports = { APP_PORT: 7003, //本利用的端口 DUMPPROXY_PORT: 9876, //mongo本机代理端口 REMOTE_MONGOD_PORT: 27017, //数据库所在的服务器mongod服务端口 REMOTE_HOST: '*.*.*.*',//数据库所在的服务器地址 REMOTE_PORT: 22, //数据库所在的服务器ssh登录端口 REMOTE_USER: 'root', //数据库所在的服务器登录用户名 REMOTE_DB_NAME: 'my-db', //所需备份的数据库名 CRON_RULE: '0 0 0/6 * * ?', //指定cron规定,按此规定进行定时备份}外围代码次要包含两处: ...

March 5, 2021 · 1 min · jiezi

关于mongodb:关于MongoDB

简介 MongoDB为面向文档(基于分布式文件存储)数据库(非关系型数据库)非关系型数据库的构造:一台服务器 => 数据库 => 汇合 => 文档非关系型数据库用于超大规模数据的存储面向文档数据库会将数据以文档模式存储。每个文档都是自蕴含的数据单元,是一系列数据项的汇合。每个数据项都有一个名词与对应值,值既能够是简略的数据类型,如字符串、数字和日期等;也能够是简单的类型,如有序列表和关联对象。数据存储的最小单位是文档,同一个表中存储的文档属性能够是不同的,数据能够应用XML、JSON或JSONB等多种形式存储长处:高性能,易部署,易使用,存储数据不便面向汇合存储,易存储对象类型的数据模式自在反对动静查问反对齐全索引,蕴含外部对象反对查问反对复制和故障复原应用高效的二进制数据存储,包含大型对象(如视频)主动解决碎片,以反对云计算档次的扩展性反对ruby,python,java,c++,php等多种语言文件存储格局为BSON(一种JSON的扩大),可间接存储对象,数组局部利用场景:视频直播:应用MongoDB存储点赞,评论,弹幕信息...游戏场景:应用MongoDB存储打怪记录,用户积分...社交场景:应用MongoDB存储朋友圈信息,浏览记录...电商场景:应用MongoDB存储购物车,珍藏...官网:https://www.mongodb.com/MongoDB的装置 下载安装地址:https://www.mongodb.com/try/downloadwindows具体装置与配置教程可查看网址:https://blog.csdn.net/baidu_39298625/article/details/98592631MongoDB的可视化工具 RoBo3T是MongoDB的可视化界面管理工具下载安装地址:https://robomongo.org/download具体装置与配置教程可查看网址:https://www.cnblogs.com/smart-girl/p/11283449.htmlMongoDB的文件目录阐明 将MongoDB装置成window服务 先在非系统盘下创立一个文件夹mongodb,再创立两个子文件夹db和log应用命令挂载服务:在cmd中输出命令:mongod --dbpath "G:\mongodb\db"(db的门路)--logpath "G:\mongodb\log\mongodb.log"(log文件夹的门路,主动创立一个mongodb.log文件)--install --serviceName "MongoDB"(服务名称)查看服务:我的电脑 -> 右键 -> 治理 -> 服务与应用程序 -> 服务应用这些命令的前提是已挂载到windows服务上开启服务的命令:net start mongodb(服务名)敞开服务的命令:net stop mongodb(服务名)卸载服务的命令:sc delete mongodb(服务名)没有挂载服务的话,可间接在cmd中进入mongodb的bin目录下,输出命令:mongod --dbpath= G:\mongodb\data(data的门路)来开启服务MongoDB常用命令 进入数据库管理模式:mongo在数据库管理模式中只能执行数据库命令,不能执行其余命令 退出数据库管理模式:exit罕用的数据库命令:1. 显示所有的数据库列表:show dbs2. 创立数据库:use 数据库名 (若数据库名不存在则创立,若已存在则进入)3. 查看以后数据库是哪个:db4. 删除数据库:db.dropDatabase()对于汇合的命令: 1. 显示以后数据库的所有汇合:show collections2. 创立汇合:db.汇合名.insert({}) (通常在创立数据时主动创立汇合,不须要独自创立) db.createCollections(汇合名)3. 删除汇合:db.汇合名.drop()对于文档(数据)的操作:1. 新增文档(数据):db.汇合名.insert({BSON数据}) (向汇合中插入一条数据)(举荐应用) db.汇合名.save({BSON数据}) (向汇合中插入一条数据,若汇合中曾经存在该数据则更新)(该办法新版本已弃用,可应用db.汇合名.insertOne()或db.汇合名.replaceOne()) db.汇合名.insertOne({BSON数据}) 2. 查看文档(数据):db.汇合名.find() (查找以后汇合中的所有数据,是个数组) db.汇合名.find({条件对象}) (查找符合条件的文档(数据)) db.汇合名.findOne() (查找以后汇合中的第一条数据) db.汇合名.find().pretty() (将找到的数据以格式化的结果显示进去)3. 批改文档(数据):db.汇合名.update(查找的对象,批改后果) db.汇合名.update({批改1},{批改2},{multi:true}) ({multi:true}示意能更新多条数据) db.汇合名.update({条件},{$inc:{key:value}}) ($inc实现对某列的值进行自增操作)4. 删除文档(数据):db.汇合名.remove({}) ({}为空则删除以后汇合中的所有数据,{}有值则删除合乎对应条件的数据)(因为删除和更新操作数据会造成极大影响,所以要审慎!)一些高级命令:1. 按指定条件查问:db.汇合名.find({key:value})2. 按大于某个范畴的条件查问:db.汇合名.find({key:{$gt:value}}) (key>value)3. 按大于等于某个范畴的条件查问:db.汇合名.find({key:{$gte:value}}) (key>=value)4. 按小于某个范畴的条件查问:db.汇合名.find({key:{$lt:value}}) (key<value)5. 按小于等于某个范畴的条件查问:db.汇合名.find({key:{$lte:value}}) (key<=value)6. 查问指定范畴的数据:db.汇合名.find({key:{$gt:value1,$lt:value2}})7. 查问指定的数据是否在数组中:db.汇合名.find({key:{$in:[...]}})8. 按数组元素的个数查找:db.汇合名.find({key:{$size:数量}})9. 查找多个条件中合乎其中一个条件的数据:db.汇合名.find({$or:[{key1:value1},{key2:value2},...}]})10. 查找同时合乎多个条件的数据:db.汇合名.find({key1:value1,key2:value2})11. 排序:db.汇合名.find().sort({key1:1/-1,key2:1/-1}) (1代表升序,-1代表降序)12. 限定输入数据的条数.limit(Number),跳过指定的数据条数.skip(Number) (配合应用,个别用作分页性能) 返回汇合的条数:db.汇合名.find().count()e.g. 当初有100条数据,每页显示10条,一共有多少页?(10页) 若以后在第2页上,应显示哪些数据?(11-20之间的数据(即跳过前10条))13. 含糊查问:db.汇合名.find({key:/相应的reg/}) (可用于查找某姓之人或含某些关键字的)MongoDB---聚合函数 ...

March 5, 2021 · 1 min · jiezi

关于mongodb:MongoDB-在评论中台的实践

本文次要讲述 vivo 评论中台在数据库设计上的技术摸索和实际。 一、业务背景随着公司业务倒退和用户规模的增多,很多我的项目都在打造本人的评论性能,而评论的业务状态根本相似。过后各我的项目都是各自设计实现,存在较多反复的工作量;并且不同业务之间数据存在孤岛,很难产生分割。因而咱们决定打造一款公司级的评论业务中台,为各业务方提供评论业务的疾速接入能力。在通过对各大支流 APP 评论业务的竞品剖析,咱们发现大部分评论的业务状态都具备评论、回复、二次回复、点赞等性能。 具体如下图所示: 波及到的外围业务概念有: 【主题 topic】评论的主题,商城的商品、利用商店的 APP、社区的帖子【评论 comment】用户针对于主题发表的内容【回复 reply】用户针对于某条评论发表的内容,包含一级回复和二级回复二、数据库存储的抉择团队在数据库选型设计时,比照了多种支流的数据库,最终在  MySQL  和  MongoDB  两种存储之进行抉择。 因为评论业务的特殊性,它须要如下能力: 【字段扩大】业务方不同评论模型存储的字段有肯定差别,须要反对动静的主动扩大。【海量数据】作为公司中台服务,数据量随着业务方的增多成倍增长,须要具备疾速便捷的程度扩大和迁徙能力。【高可用】作为中台产品,须要提供疾速和稳固的读写能力,可能读写拆散和主动复原。而评论业务不波及用户资产,对事务的要求性不高。因而咱们选用了 MongoDB 集群 作为最底层的数据存储形式。 三、深刻理解 MongoDB3.1 集群架构因为单台机器存在磁盘/IO/CPU等各方面的瓶颈,因而以 MongoDB 提供集群形式的部署架构,如图所示: 次要由以下三个局部组成: mongos:路由服务器,负责管理利用端的具体链接。利用端申请到mongos服务后,mongos把具体的读写申请转发到对应的shard节点上执行。一个集群能够有1~N个mongos节点。config:配置服务器,用于分存储分片汇合的元数据和配置信息,必须为 复制集(对于复制集概念戳我) 形式部署。mongos通过config配置服务器合的元数据信息。shard:用于存储汇合的分片数据的mongod服务,同样必须以 复制集 形式部署。3.2  片键MongoDB 数据是存在collection(对应 MySQL表)中。集群模式下,collection依照 片键(shard key)拆分成多个区间,每个区间组成一个chunk,依照规定散布在不同的shard中。并造成元数据注册到config服务中治理。 分片键只能在分片汇合创立时指定,指定后不能批改。分片键次要有两大类型: hash分片:通过hash算法进行散列,数据分布的更加均匀和扩散。反对单列和多列hash。范畴分片:依照指定片键的值散布,间断的key往往散布在间断的区间,更加适用范围查问场景。单数据散列性由分片键自身保障。3.3 评论中台的实际3.3.1 集群的扩大作为中台服务,对于不同的接入业务方,通过表隔离来辨别数据。以comment评论表举例,每个接入业务方都独自创立一张表,业务方A表为  comment_clientA ,业务方B表为 comment_clientB,均在接入时创立表和相应索引信息。但只是这样设计存在几个问题: 单个集群,不能满足局部业务数据物理隔离的须要。集群调优(如split迁徙工夫)很难业务个性差异化设置。程度扩容带来的单个业务方数据过于扩散问题。因而咱们扩大了 MongoDB的集群架构: 扩大后的评论MongoDB集群 减少了 【逻辑集群】和【物理集群】的概念。一个业务方属于一个逻辑集群,一个物理集群蕴含多个逻辑集群。减少了路由层设计,由利用负责扩大Spring的MongoTemplate和连接池治理,实现了业务到MongoDB集群之间的切换抉择服务。不同的MongoDB分片集群,实现了物理隔离和差别调优的可能。3.3.2 片键的抉择MongoDB集群中,一个汇合的数据部署是扩散在多个shard分片和chunk中的,而咱们心愿一个评论列表的查问最好只拜访到一个shard分片,因而确定了 范畴分片 的形式。 起初设置只应用单个key作为分片键,以comment评论表举例,次要字段有{"_id":惟一id,"topicId":主题id,"text":文本内容,"createDate":工夫} ,思考到一个主题id的评论尽可能间断散布,咱们设置的分片键为   topicId。随着性能测试的染指,咱们发现了有两个十分致命的问题: jumbo chunk问题惟一键问题jumbo chunk: 官网文档中,MongoDB中的chunk大小被限度在了1M-1024M。分片键的值是chunk划分的惟一根据,在数据量继续写入超过chunk size设定值时,MongoDB 集群就会主动的进行决裂或迁徙。而对于同一个片键的写入是属于一个chunk,无奈被决裂,就会造成  jumbo chunk 问题。 举例,若咱们设置1024M为一个chunk的大小,单个document 5KB计算,那么单个chunk可能存储21W左右document。思考热点的主题评论(如微信评论),评论数可能达到40W+,因而单个chunk很容易超过1024M。超过最大size的chunk仍然可能提供读写服务,只是不会再进行决裂和迁徙,短暂以往会造成集群之间数据的不均衡.惟一键问题: MongoDB 集群的惟一键设置减少了限度,必须是蕴含分片键的;如果_id不是分片键,_id索引只能保障单个shard上的唯一性。 You cannot specify a unique constraint on a hashed indexFor a to-be-sharded collection, you cannot shard the collection if the collection has other unique indexesFor an already-sharded collection, you cannot create unique indexes on other fields因而咱们删除了数据和汇合,调整    topicId 和 _id 为联结分片键 从新创立了汇合。这样即突破了chunk size的限度,也解决了唯一性问题。 ...

March 1, 2021 · 1 min · jiezi

关于mongodb:去除mongoDB自动生成的class属性

0.问题景象mongo数据中props属性下的每个属性会有_class属性,会造成数据的冗余,节约存储空间,可能11KB的数据有5KB用来存储_class了 1.产生起因:数据校验代码中批量批改,是针对PropValue对象进行的批改 ,而mongoDB数据库中随实体主动生成的“_class”字段,所以点击"数据校验"后每个层级属性都会多了_class属性(不只是老本组团) 2.解决方案:(1)应用注解形式退出配置自定义MappingMongoConverter对象 但这会导致各层级的数据中就都不会有_class属性,对现有性能可能会造成影响 (2)将update.set批改的对象改为整个DataEntity,但要批改多处的代码,且会影响效率,所以暂不解决

February 24, 2021 · 1 min · jiezi

关于mongodb:最全-MongoDB-基础教程

MongoDB创立数据库- 格局:use DATABASE_NAME - use ruochen - db创立数据库须要插入一条数据才会在列表中显示 - db.ruochen.insert({'name': '若尘'}) - show dbs删除数据库格局:db.dropDatabase() use ruochendb.dropDatabase()show dbs创立汇合- 格局:db.createCollection(name, options)- name: 要创立的汇合名称- options: 可选参数,指定无关内存大小及索引的选项字段类型形容capped布尔(可选)如果为 true,则创立固定汇合。固定汇合是指有着固定大小的汇合,当达到最大值时,它会主动笼罩最早的文档。当该值为 true 时,必须指定 size 参数。autoIndexId布尔(可选)如为 true,主动在 _id 字段创立索引。默认为 false。size数值(可选)为固定汇合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也须要指定该字段。max数值(可选)指定固定汇合中蕴含文档的最大数量。在插入文档时,MongoDB 首先查看固定汇合的 size 字段,而后查看 max 字段实例# 在test数据库中创立ruochen 汇合use testdb.createCollection('ruochen')# 查看已有汇合show collectionsdb.createCollection('test', {capped: true, autoIndexId: true, size: 1024000, max: 10000}) # autoIndexId 已弃用,默认_id增加索引# 插入文档时,MongoDB会主动创立汇合db.ruochen.insert({'name': 'ruochen'})删除汇合格局:db.collection.drop() use ruochendb.createCollection('ruochen') # 创立汇合show tablesdb.ruochen.drop()show tables插入文档格局:db.COLLECTION_NAME.insert(document) 办法1db.ruochen.insert({title: 'MongoDB 教程',description: 'shu ju ku',by: 'ruochen',tags: ['mongodb', 'database', 'NoSQL']}) ...

February 19, 2021 · 3 min · jiezi

关于mongodb:mongodb的索引实现该用B树还是B树

一、B or B+ ?对于mongodb的索引实现,我目前都不太确定是B+树,还是B树,因为mongodb的官网文档中明确阐明应用B树实现的:然而云栖上有人说问过WiredTiger的作者确认用的也是B+树: 本文并不想八卦谁对谁错,只单纯的剖析mongodb实践上,用哪一种数据结构实现索引,更适宜,只代表自己观点,说的不对,欢送斧正 二、B树与B+树各自的优缺点B+是B树的进阶型,不同于B树的非叶子节点能够存储数据(或者是数据的物理地址),B+树中所有的数据都寄存在叶子节点中,因而,查问速度十分稳固,具体比照见我的这篇[博客]。(https://segmentfault.com/a/11... 三、针对mongodb这种非sql数据库,哪一种数据结构更快?耗时一上午检索,找到了几种mongodb应用B树的"强行"解释,我将其归为如下:既然是非sql数据库,就应该好好利用其反对文本\简单数据类型的劣势,通过表构造的设计,保障数据库的使用者,通过单条查问就能拿到数据,而B树的遍历查问效率尽管不如B+树,然而因为非叶子节点间接就能拿到并返回数据,因而单条查问速度是快于B树的典型例子见这2篇博客1|博客2以下是自己观点:B树的单条查问的确是会更快,然而以自己所经验的我的项目教训来说,mongodb的表不会都是单条查问的场景,更多的应用场景还是基于几个属性的遍历,当然这能够通过创立复合索引去放慢查找速度,然而创立多个索引,自身就会极大的升高数据库写的性能,创立多个索引之后读的性能也不会比照B+树有更多的劣势。综上,如果自己作为引擎的开发者,会抉择B+树作为实现索引的数据结构,只管这就义了一部分单条查问的性能,然而罕用场景下查问的性能更为牢靠。

February 6, 2021 · 1 min · jiezi

关于mongodb:2天完成17TB数据量迁移华为云数据库是如何做的

摘要:童年时候,咱们会对着墙上挂着的中国地图,来意识一处处山川河流和城市人文。现在,数字化时代下,传统的地图曾经不能满足人们的需要,如何获取各种丰盛的天文内容和实时动静信息成为现代人广泛的地理信息诉求。作为国家根底地理信息公共服务平台,天地图集成了来自国家、省、市(县)各级测绘地理信息部门,以及相干政府部门、企事业单位 、社会个人、公众的地理信息公共服务资源,以门户网站、服务接口、前置服务等模式向政府、业余部门、企业、公众等用户提供在线地理信息服务。此前,国家根底天文信息中心携手华为云,基于天地图平台,独特打造云上智慧地图,促成地理信息资源共享和高效利用,让世界触手可及。天文数据量减少,数据库弹性迎挑战天地图覆盖全国300多个地级以及地级以上城市0.6米分辨率的卫星遥感影像等地理信息数据,全库数据量达到17TB,数据吞吐量微小。微小的吞吐量和高额运维老本,促使国家根底天文信息中心迫切寻求低成本、高可用、高性能、大容量的数据库产品,同时心愿能够将迁徙工夫压缩到2天左右。 低成本:晚期天地图经营投入较多资金,包含数据库在内的IT投入老本居高不下。业务有读写拆散诉求,心愿在保障性能的前提下,通过一套实例实现读写拆散,从而升高数据库老本。高可用:社区版MongoDB一个shard少数节点故障,就会导致该shard成为只读,因而心愿提供无状态的路由节点,实现疾速故障转移。高性能:天地图每天的访问量在6亿左右,随着数据量和业务访问量的减少,现有零碎不足以撑持日益增长的业务需要,须要更高性能的数据库来撑持日益增长的业务数据。容量:随着瓦片层级减少,数据量越来越大,现有MongoDB扩容难度大,须要一款数据库反对不少于20TB的瓦片数据,反对在线扩容。运维效率:运维人力无限,零碎运维压力越来越大,运维工作老本越来越高,现有社区版MongoDB难以撑持运维工作需要。心愿可能提供数据库自运维能力,能为数据库做技术兜底,升高运维老本。 天地图&华为云彰显云上“数字中国”新魅力天地图业务数据简单,数据品种多样,联合客户诉求和业务特点,华为云数据库采纳私有云对外服务为主,公有云对内测试为辅的混合云架构,提供多种数据库引擎计划,联结打造高性能、高可用的数字底座。 华为云GaussDB(for Mongo)提供在线地图的瓦片数据处理服务;华为云RDS for PostgreSQL提供矢量数据和三维数据处理服务;华为云RDS for MySQL提供用户治理和专题图层属性服务,多款数据库极速交融,独特发力,17TB的海量数据迁徙仅仅用了2天。 高可用个性加持,业务稳固运行天地图作为国家级的服务平台,数据的安全可靠堪称至关重要。华为云GaussDB(for Mongo)反对跨AZ高可用,领有欠缺的跨区域容灾策略,每天主动进行全量备份和增量备份,并定期进行复原演练,验证备份复原流程的有效性,实现分钟级备份复原。同时提供无状态的路由节点,反对秒级故障转移,客户业务无感知,业务运行稳固。 超高性能与大容量,再大流量也不怕天地图为30+部委机构和全国30多个省市提供地理信息根底平台服务,日均API和服务调用超过6亿次,拜访压力极大。华为云GaussDB(for Mongo) 可实现分钟级节点扩容和秒级存储扩容,满足麻利业务弹性须要,对天地图高达上亿的拜访毫无压力,响应能力快稳准,无效保障了天地图在高负载情景下业务的失常运行。而且GaussDB(for Mongo)基于存算拆散架构和rocksdb优化,相比开源MongDB性能进步3倍以上,最大反对96TB的数据处理能力,齐全满足天地图海量业务申请。 降本增效不止一点点GaussDB(for Mongo)齐全兼容MongoDB协定,客户业务无需任何革新,即可轻松切换数据库,极大缩小了革新老本;而且通过实时生成快照和删除快照的能力,GaussDB(for Mongo)实现一套集群即可提供读写拆散的能力,数据库老本节俭至多50%。天地图上华为云之后,基于数据库服务自动化运维平台,数据更新效率晋升5倍,新业务上线速度进步2倍,还加重了DBA沉重的运维压力,让客户更聚焦业务层面。 自2019年2月上线以来,华为云数据库已轻松撑持天地图6亿+的日均访问量,保障业务安稳运行,实现零事变;同时为公众提供了更为全面、精准、权威、 智能、人性化的地理信息服务,让全社会共享测绘倒退成绩,感触“数字中国”的独特魅力。 Ps:【云数据库特惠专场】新用户4.5折起,助力企业效益增长,详情请戳https://activity.huaweicloud.com/dbs_Promotion/index.html 点击关注,第一工夫理解华为云陈腐技术~

February 3, 2021 · 1 min · jiezi

关于mongodb:手把手超详细Docker部署MongoDB集群

Mongodb集群搭建mongodb 集群搭建的形式有三种: 主从备份(Master - Slave)模式,或者叫主从复制模式。正本集(Replica Set)模式。分片(Sharding)模式。其中,第一种形式根本没什么意义,官网也不举荐这种形式搭建。另外两种别离就是正本集和分片的形式。明天介绍正本集的形式搭建mongodb高可用集群简介以及概述 首先咱们先来理解一下Mongo集群的概念,Mongo集群有3个次要组件 ConfigServer:在集群中表演存储整个集群的配置信息,负责配置存储,如果须要高可用的ConfigServer那么须要3个节点。 Shard:分片,存储实在的数据,每一个Shard分片都负责存储集群中的数据,例如一个集群有3个分片,而后咱们定义分片规定为哈希,那么整个集群的数据就会(宰割)到3个分片中的某一个分片,那么分片是特地重要的,如果集群中的一个分片全副解体了那么集群将不可用,所以咱们要保障集群的高可用,那么咱们须要一个分片配置3个节点,2个正本集一个仲裁节点,仲裁节点相似于Redis的哨兵模式,如果发现主节点挂了那么让另一个正本集进行数据存储。 Mongos:Mongos咱们能够了解为整个集群的入口,相似于Kafka的Broker代理,也就是客户端,咱们通过客户端连贯集群进行查问。 上面是MongoDB的官网集群架构图,咱们看到Mongos是一个路由,他们的信息都存储在ConfigServer中,咱们通过Mongos进行增加,而后依据条件将数据进行分片到分片的正本集中。 Mongo分片集群(非高可用,不举荐)搭建ConfigServer首先咱们搭建两个config-server 创立两个config-server的配置文件 #创立config-server-1mkdir -p /docker/mongo-cluster/mongo-server1/{data,conf}#创立config-server-2mkdir -p /docker/mongo-cluster/mongo-server2/{data,conf}而后配置文件中配置端口 #创立第一个配置文件#写入配置信息,端口号echo "# mongodb.conflogappend=true# bind_ip=127.0.0.1port=20011auth=false" > /docker/mongo-cluster/mongo-server1/conf/mongo.conf#创立第二个配置文件#写入配置信息,端口号echo "# mongodb.conflogappend=true# bind_ip=127.0.0.1port=20012auth=false" > /docker/mongo-cluster/mongo-server2/conf/mongo.conf而后启动容器 #启动Server1docker run --name mongo-server1 -d \--net=host \--privileged=true \-v /docker/mongo-cluster/mongo-server1/conf:/data/configdb \-v /docker/mongo-cluster/mongo-server1/data:/data/db \docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --configsvr --replSet "rs_config_server" --bind_ip_all docker run --name mongo-server2 -d \--net=host \--privileged=true \-v /docker/mongo-cluster/mongo-server2/conf:/data/configdb \-v /docker/mongo-cluster/mongo-server2/data:/data/db \docker.io/mongo:latest mongod -f /data/configdb/mongo.conf --configsvr --replSet "rs_config_server" --bind_ip_all 而后进入容器初始化 ...

February 1, 2021 · 7 min · jiezi

关于mongodb:springboot配置mongodb连接池

application.yml 配置mongodb: address: localhost:27017 database: soms username: admin password: 123456 # 连接池配置 clientName: soms-task # 客户端的标识,用于定位申请起源等 connectionTimeoutMs: 10000 # TCP连贯超时,毫秒 readTimeoutMs: 15000 # TCP读取超时,毫秒 poolMaxWaitTimeMs: 3000 #当连接池无可用连贯时客户端阻塞期待的时长,单位毫秒 connectionMaxIdleTimeMs: 60000 #TCP连贯闲置工夫,单位毫秒 connectionMaxLifeTimeMs: 120000 #TCP连贯最多能够应用多久,单位毫秒 heartbeatFrequencyMs: 20000 #心跳检测发送频率,单位毫秒 minHeartbeatFrequencyMs: 8000 #最小的心跳检测发送频率,单位毫秒 heartbeatConnectionTimeoutMs: 10000 #心跳检测TCP连贯超时,单位毫秒 heartbeatReadTimeoutMs: 15000 #心跳检测TCP连贯读取超时,单位毫秒 connectionsPerHost: 100 # 每个host的TCP连接数 minConnectionsPerHost: 5 #每个host的最小TCP连接数 #计算容许多少个线程阻塞期待可用TCP连贯时的乘数,算法: threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost,以后配置容许10*20个线程阻塞 threadsAllowedToBlockForConnectionMultiplier: 10用来获取配置参数的类import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import org.springframework.validation.annotation.Validated;import javax.validation.constraints.Min;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;import java.util.List;@Data@Validated@Component@ConfigurationProperties(prefix = "mongodb")public class MongoClientOptionProperties { /** 根底连贯参数 */ private String database; private String username; private String password; @NotNull private List<String> address; /** 客户端连接池参数 */ @NotNull @Size(min = 1) private String clientName; /** socket连贯超时工夫 */ @Min(value = 1) private int connectionTimeoutMs; /** socket读取超时工夫 */ @Min(value = 1) private int readTimeoutMs; /** 连接池获取链接等待时间 */ @Min(value = 1) private int poolMaxWaitTimeMs; /** 连贯闲置工夫 */ @Min(value = 1) private int connectionMaxIdleTimeMs; /** 连贯最多能够应用多久 */ @Min(value = 1) private int connectionMaxLifeTimeMs; /** 心跳检测发送频率 */ @Min(value = 2000) private int heartbeatFrequencyMs; /** 最小的心跳检测发送频率 */ @Min(value = 300) private int minHeartbeatFrequencyMs; /** 计算容许多少个线程阻塞期待时的乘数,算法:threadsAllowedToBlockForConnectionMultiplier*connectionsPerHost */ @Min(value = 1) private int threadsAllowedToBlockForConnectionMultiplier; /** 心跳检测连贯超时工夫 */ @Min(value = 200) private int heartbeatConnectionTimeoutMs; /** 心跳检测读取超时工夫 */ @Min(value = 200) private int heartbeatReadTimeoutMs; /** 每个host最大连接数 */ @Min(value = 1) private int connectionsPerHost; /** 每个host的最小连接数 */ @Min(value = 1) private int minConnectionsPerHost;}配置类package com.alkin.soms.common.mongo;import com.mongodb.MongoClient;import com.mongodb.MongoClientOptions;import com.mongodb.MongoCredential;import com.mongodb.ServerAddress;import org.apache.commons.lang.StringUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.NoSuchBeanDefinitionException;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.mongodb.MongoDbFactory;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.SimpleMongoDbFactory;import org.springframework.data.mongodb.core.convert.*;import org.springframework.data.mongodb.core.mapping.MongoMappingContext;import java.util.ArrayList;import java.util.List;@Configurationpublic class MongoConfig { private final Logger log = LoggerFactory.getLogger(MongoConfig.class); /** * 自定义mongo连接池 * * @param properties * @return */ @Bean @Autowired public MongoDbFactory mongoDbFactory(MongoClientOptionProperties properties) { //创立客户端参数 MongoClientOptions options = mongoClientOptions(properties); //创立客户端和Factory List<ServerAddress> serverAddresses = new ArrayList<>(); for (String address : properties.getAddress()) { String[] hostAndPort = address.split(":"); String host = hostAndPort[0]; int port = Integer.parseInt(hostAndPort[1]); ServerAddress serverAddress = new ServerAddress(host, port); serverAddresses.add(serverAddress); } String username = properties.getUsername(); String password = properties.getPassword(); String database = properties.getDatabase(); MongoClient mongoClient; if (StringUtils.isNotEmpty(username) && StringUtils.isNotEmpty(password)) { //创立认证客户端 MongoCredential mongoCredential = MongoCredential.createScramSha1Credential( username, database, password.toCharArray()); mongoClient = new MongoClient(serverAddresses.get(0), mongoCredential, options); } else { //创立非认证客户端 mongoClient = new MongoClient(serverAddresses, options); } SimpleMongoDbFactory mongoDbFactory = new SimpleMongoDbFactory(mongoClient, database); log.info("mongodb注入胜利"); return mongoDbFactory; } @Bean(name = "mongoTemplate") @Autowired public MongoTemplate getMongoTemplate(MongoDbFactory mongoDbFactory) { return new MongoTemplate(mongoDbFactory); } /** * mongo客户端参数配置 * * @return */ public MongoClientOptions mongoClientOptions(MongoClientOptionProperties properties) { return MongoClientOptions.builder() .connectTimeout(properties.getConnectionTimeoutMs()) .socketTimeout(properties.getReadTimeoutMs()).applicationName(properties.getClientName()) .heartbeatConnectTimeout(properties.getHeartbeatConnectionTimeoutMs()) .heartbeatSocketTimeout(properties.getHeartbeatReadTimeoutMs()) .heartbeatFrequency(properties.getHeartbeatFrequencyMs()) .minHeartbeatFrequency(properties.getMinHeartbeatFrequencyMs()) .maxConnectionIdleTime(properties.getConnectionMaxIdleTimeMs()) .maxConnectionLifeTime(properties.getConnectionMaxLifeTimeMs()) .maxWaitTime(properties.getPoolMaxWaitTimeMs()) .connectionsPerHost(properties.getConnectionsPerHost()) .threadsAllowedToBlockForConnectionMultiplier( properties.getThreadsAllowedToBlockForConnectionMultiplier()) .minConnectionsPerHost(properties.getMinConnectionsPerHost()).build(); } @Bean public MappingMongoConverter mappingMongoConverter(MongoDbFactory factory, MongoMappingContext context, BeanFactory beanFactory) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory); MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context); try { mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class)); } catch (NoSuchBeanDefinitionException ignore) { } // Don't save _class to dao mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null)); return mappingConverter; }}

January 26, 2021 · 2 min · jiezi

关于mongodb:得物技术教你秒懂mongoDB之分片集群

背景随着公司直播平台的全面凋谢,加上直播玩法的多样降级,最显著的感触就是: ① 数据增量显著。 ② 并发量显著变大。 应答这两种变动,作为后端开发就须要在技术选型方面做一些抉择。以后直播量大的业务都是利用mysql进行了分表处理。然而察看一段时间下来发现以下几个问题: ① 局部业务的分表上存储的数据量不是很平衡,会存在一些大主播对应的分表数据量显著偏大。 ② 上新业务或者一些新流动就要建几十张表以提前应答已知的数据量,操作繁琐且后续变更不不便。 所以在做技术选型的时候就联想到了mongoDB的分片集群。上面咱们来一探到底: 一、回顾一下MongoDB的特点1 灵便的模型区别于关系数据库最大的一个特点就是字段灵便变更,这就非常适合一些迭代频繁且数据模型多变的业务场景。例如咱们直播的流动业务场景,以后直播流动越来越多,玩的花色也是越来越多,其实就很适宜用mongoDB来做流动业务的数据存储。 2 json数据格式mongoDB的数据存储都是json格局,非常适合微服务Restful Api。 3 横向扩大能力与mysql的分库分表不同,它能够在业务代码不变更的状况下做主动程度扩大。可能很好的解决上文形容的两个场景① 分表数据不平均 ② 分表数据过大要调整原有数据分布。 二、说一说MongoDB的分片集群的原理和机制在正式形容分片集群之前,咱们先看一下以后MongoDB的架构部署形式如下图: 从上图咱们能够很清晰的看到罕用的架构模式气氛三种:1、单机版:只用于开发和测试环境,没有高可用。2、复制集:个别是一主二从,当然也能够配置更多从库。大部分用户的生产环境在应用,可能满足绝大多数业务场景,且是高可用。3、分片集群:满足横向扩大能力且高可用。 分片的组成部分如下图所示: 咱们把上图分为四个模块来讲: 1. 应用程序+驱动程序2. 路由节点(mongos)路由节点次要是用来管制散发到哪一个分区(shard),因为mongos他存储有一个映射表。这个映射表的数据就是config节点存储的映射数据同步过去的。个别是在mongo启动的时候load到mongos的内存。 从上图能够看到mongos有多个,其实这也是为了满足高可用的场景。 3. 配置节点(config)数据节点次要存储了集群元数据的存储,数据分布映射关系表。 存储的数据表格局如下图展现: 4. 数据节点(shard)上图最上面的区域就是分片的数据节点,每一个分片都满足高可用,个别都是一主二从。分片的个数最大能够到1024个。所有分片合到一起就是残缺的数据。不存在反复数据。 到此咱们对分片集群的组成部分大略形容完了。 你会不会有这样的疑难?配置表里存的数据分布范畴是怎么定的?mongoDB的分片集群到底是怎么做数据平衡的?如果你有其余疑难能够在文末给我留言,在答复下面问题前我先解释几个概念,咱们看下图 如图所示咱们能够看到以下几个名词,分表是集群>片>块>文档。 一个集群是由多个分片组成,一个分片存储了多个块(备注:逻辑上的数据分块),一个块蕴含多个文档。文档不是最小单位,文档里存着一个个字段,一个字段或者多个字段能够组成为一个片键。 片键有什么用?片键决定了你的数据能够分成多少块。 到此基础概念介绍完了,我来答复一下下面的疑难。 对于数据分布,mongoDB提供了三种形式a. 基于范畴 如图所示,数据在逻辑上被分成了4个块:举个例子你的零碎存的是公司用户信息,如果你按年龄来分,假如公司年龄段在18-60,且按一个年龄分一个块,那么最大能够分43个块。再把块分到多个分片下来。这时咱们查问某一个年龄段的数据,比方22-25之间的数据,个别很大可能是在同一个片或者两个片上。故而在范畴查问性能上体现较好。那么问题来了,这时咱们把数据有限放大,公司年龄在22-25之间的占比80以上,这时咱们会发现22-25岁的用户数据所在的片和别的片比起来就很显得特地大,这也就是咱们说的数据分布不平衡的状况。新增数据都是在22-25岁之间,这时也就导致了热点片的状况。 b. 基于hash 如上图所示,片键不是间断的而是通过hash散列到不同的片区,这就很好的解决了数据不平均的状况。然而同时带来的问题就是,范畴查问的场景效率特地低,须要遍历全副的分片能力满足业务查问。举个例子用户的订单零碎,咱们依照下单用户id去做hash,这样不同用户的订单数据就会被平均的散布到不同的分片。单查某个用户的订单数据是十分高效的,然而如果去依据工夫范畴去查则要去扫描全副分片。 c. 基于zone 顾名思义,基于地区去划分。有时候咱们服务的可能是寰球用户,又因其地域性则能够人造的按地区去划分分片。这样很好的保障,在某固定地区能够拜访到最近的数据节点。 到此对于上文中的第一个疑难是否恍然大悟?上面咱们再来答复第二个问题: 简略来说,mongo他提供了两个程序: ① 切割器 切割器能够对某个源分片的数据按chunk(数据逻辑块)去做切割。 ② 平衡器 当某些分片数据不平均的状况下,平衡器就发挥作用了,他会收回一个命令让切割器去须要挪动的分片下来做数据切割,再把数据挪动到数据少的分片上。具体的步骤如下: 平衡器向源分片发送moveChunk的命令源分片收到命令后,会启动本人外部的一个moveChunk命令,如果在数据挪动过程中有客户端发来读写申请的话,都会发送到源分片。(因为配置服务器上的元数据还没有扭转)指标片开始向源分片申请将要挪动的数据块的文档,筹备拷贝文档数据。当指标分片接管到据块的最初一个文档后,指标分片会启动一个同步过程来查看,是否曾经拷贝齐全部的文档。当同步实现后,指标分片会连贯配置服务器,更新元数据列表中数据块的地址。当指标分片实现元数据更新后,源分片就会删除原来的数据块.如果有新的数据块须要挪动的话,能够持续进行挪动。配置服务器会告诉monogs过程更新本人的映射表。到此咱们对于上文的第二个问题,也做了较为详尽的形容。上面来演绎一下MongoDB的分片集群的特点: 利用全透明,无非凡解决对于开发很敌对,不须要做改变,mongo架构部署变动不影响业务代码。 数据主动平衡再也不必放心某个分片过大的状况,然而这里要留神的是你的分块必须要做到不能太大,不然老天也帮不了你。因为太大的话,常常会呈现挪动失败的状况。 动静扩容,毋庸下线如果以后生产环境是mongo复制集的架构,能够在线上环境间接切到分片集群架构。如果你应用阿里云的mongoDb服务,阿里提供了两种形式:1全量切 2增量切(留神增量切是须要另外付费的)对于用户来说操作很不便。 三、说一说分片集群实用的场景下面咱们把分片集群的概念,包含组成,实现机制,特点都形容完了。我置信大家也对分片集群有了一个较为残缺的意识。上面咱们聊一聊哪些场景咱们须要思考应用分片集群呢? 1.数据容量日益增大,拜访性能升高2.新品上线异样火爆,如何撑持更多的并发用户直播打榜流动热火朝天的举办,局部业务数据增量和并发也有显著回升,目前来看无需调整部署策略能够轻松应答,假如这个增量有限陡增,那么就能够思考应用分片集群,以解决数据库性能瓶颈。 3.单库已有海量数据,出了故障如何疾速复原这时候咱们须要提前预判危险问题,不能等出了故障再思考应用分片集群。海量数据(假如数据已达TB级别)去做数据恢复耗时很长。 ...

January 15, 2021 · 1 min · jiezi

关于mongodb:MongoDB年终大会转移至线上进行-周五参会指南

会议调整告诉社区的敌人、各位mongoer,大家好! 前阵子咱们始终筹备着可能跟大家在线下相聚,切磋交换,期待着跟大家见面。 但在会议筹备过程,发现很多敌人在这个非凡的期间还不不便来上海线下跟大家相聚,疫情情况也尚不稳固。 通过多方协调,咱们决定将线下大会调整为线上进行,把见面的工夫放在不久的将来,到时咱们不必带着太多担心,一起轻装赴会。 本周五,就让咱们线上相聚,一起重新认识MongoDB! 大会报名形式线上收费票:点击下方链接间接进入报名,抉择“线上票”,会前一天咱们会将参会链接发送至您报名应用的邮箱。 http://hdxu.cn/RInMN 大会看点为什么MongoDB不仅仅是文档型数据库? 通过MongoDB的定位、倒退历程,纵向Old SQL vs. NoSQL vs. NewSQL的梳理,横向MongoDB与MySQL和TiDB的比照为例,让你理解MongoDB外围业务场景及选型。MongoDB官网专家和MongoDB合作伙伴阿里云带你理解MongoDB最新性能及企业级能力。 MongoDB还能够这么玩?! 火爆了的数据中台,用MongoDB建设居然如此顺畅! 多构造海量数据怎么办?看看MongoDB在视频行业怎么用! 想要轻装上阵做开发?灵便迁徙和扩容?看看MongoDB on Kubernetes怎么玩! MongoDB一手硬核干货分享 MongoDB多样化归档有什么个性?万亿级文档数据库MongoDB集群如何优化?一手硬核干货等你来学习!还有最佳翻新案例分享! 大会议程 重新认识MongoDB-收场 MongoDB 历史回顾MongoDB中文社区介绍MongoDB中文社区如何促成MongoDB技术在国内的倒退 嘉宾介绍: 李丹,MongoDB中文社区常委会委员兼北京分会主席。原奇虎360技术专家,现任失去APP运维负责人。近12年从业教训,次要从事运维自动化、混合云平台建设及开源数据库等相干技术畛域的学习与钻研。 重新认识MongoDB-MongoDB 到底是什么样的数据库 MongoDB ,不只是个文档数据库Old SQL vs. NoSQL vs. NewSQL外围业务场景如何选型 嘉宾介绍: 郭远威,资深大数据解决方案征询参谋与架构师,MongoDB中文社区委员,长沙分会主席,多年通信行业大数据研发、布局、征询教训;《大数据存储MongoDB实战指南》作者;阿里云云计算ACP认证专家。 MongoDB 原生高可用及分布式能力解析 MongoDB 作为一个在寰球范畴内继续风行的新型数据库系统,以其灵便易用的文档模型和 MQL 语言而深受宽广开发者青睐。但除此之外,MongoDB 也具备深厚的内功,比方它的高可用设计,分布式架构设计,一致性和事务模型设计等,这些都使得它在泛滥的数据库系统中怀才不遇。本次议题就对 MongoDB 原生的高可用和分布式能力做一个零碎的介绍。 嘉宾介绍: 夏德军(花名夏周),阿里云数据库团队工程师,以后次要负责阿里云 MongoDB 服务的内核开发和保护,之前沉闷于 Redis 社区,负责阿里云 Redis 服务的开发和保护,开源我的项目 ApsaraCache 的次要贡献者。 重新认识MongoDB - 企业级能力解析 ...

January 5, 2021 · 1 min · jiezi

关于mongodb:千万级-MongoDB-数据索引优化实践

小李是这家公司的后端负责人,忽然有一天下午,收到大量客服反馈用户无奈应用咱们的APP,很多操作与加载都是网络期待超时。 收到信息后,小李立马排查问题起因,不过多一会,定位到数据库呈现大量慢查问导致服务器超负荷负载状态,CPU居高不下,那么为什么会呈现这个状况呢,此时小李很慌,通过查问材料,开始往慢查问方向探索,果不其然,因为业务数据增长迅猛,对应的数据表没有相应查问的索引数据,此刻小李嘴角上扬,面露微笑,信心百倍上手的给数据库相干数据表加上了索引字段。然而状况并没有恶化,线上仍旧没有复原,教训使然,最初只能采取降级的计划(敞开此表的相干查问业务)长期先复原线上失常。 然而事件并没有完结,问题没有根本性的解决,公司和本人仍旧十分在意这个问题的解决,早晨吃饭的时候,小李忽然想起了本人有意识一个行业大佬(老白)。把问题跟老白说了一遍,老白并没过多久,很快就业余的通知了小白哪些操作存在问题,怎么样能够正确的解决这个问题,加索引的时候首先要学会做查问剖析,而后理解ESR最佳实际规定(上面会做阐明),小李没有因为本人的有余感到失落,反而是因为本人的有余更是充斥了求知欲。 数据库索引的利用有哪些优良的姿态呢? MongoDB 索引类型单键索引db.user.createIndex({createdAt: 1}) createdAt创立了单字段索引,能够疾速检索createdAt字段的各种查问申请,比拟常见{createdAt: 1} 升序索引,也能够通过{createdAt: -1}来降序索引,对于单字段索引,升序/降序成果是一样的。 组合索引db.user.createIndex({age: 1, createdAt: 1}) 能够对多个字段联结创立索引,先按第一个字段排序,第一个字段雷同的文档按第二个字段排序,顺次类推,所以在做查问的时候排序与索引的利用也是十分重要。 理论场景,应用最多的也是这类索引,在MongoDB中是满足所以能匹配合乎索引前缀的查问,例如曾经存在db.user.createIndex({age: 1, createdAt: 1}) ,咱们就不须要独自为db.user.createIndex({age: 1}) 建设索引,因为独自应用age做查问条件的时候,也是能够命中db.user.createIndex({age: 1, createdAt: 1}) ,然而应用createdAt独自作为查问条件的时候是不能匹配db.user.createIndex({age: 1, createdAt: 1}) 多值索引当索引的字段为数组时,创立出的索引称为多key索引,多key索引会为数组的每个元素建设一条索引 // 用户的社交登录信息,schema = { … snsPlatforms:[{ platform:String, // 登录平台 openId:String, // 登录惟一标识符 }]}// 这也是一个列转行文档设计,前面会说db.user.createIndex({snsPlatforms.openId:1}) TTL 索引能够针对某个工夫字段,指定文档的过期工夫(用于仅在一段时间无效的数据存储,文档达到指定工夫就会被删除,这样就能够实现主动删除数据)这个删除操作是平安的,数据会抉择在利用的低峰期执行,所以不会因为删除大量文件造成高额IO重大影响数据性能。 局部索引3.2版本才反对该个性,给符合条件的数据文档建设索引,意在节约索引存储空间与写入老本 db.user.createIndex({sns.qq.openId:1})/** * 给qq登录openid加索引,零碎其实只有很少一部分用到qq登录 ,而后才会存在这个数据字段,这个时 * 候就没有必要给所有文档加上这个索引,仅须要满足条件才加索引 */db.user.createIndex({sns.qq.openId:1} ,{partialFilterExpression:{$exists:1}})稠密索引稠密索引仅蕴含具备索引字段的文档条目,即便索引字段蕴含空值也是如此。索引会跳过短少索引字段的所有文档。 db.user.createIndex({sns.qq.openId:1} ,{sparse:true}) 注:3.2版本开始,提供了局部索引,能够当做稠密索引的超集,官网举荐优先应用局部索引而不是稠密索引。 ESR索引规定索引字段程序: equal(精准匹配) > sort (排序条件)> range (范畴查问)准确(Equal)匹配的字段放最后面,排序(Sort)条件放两头,范畴(Range)匹配的字段放最初面,也实用于ES,ER。 ...

January 4, 2021 · 1 min · jiezi

关于mongodb:MongoDB-Mongoose与Nodejs结合使用的后端开发的最佳实践

MongoDB无疑是当今最受欢迎的NoSQL数据库抉择之一,它有一个很棒的社区和生态系统。 在本文中,咱们将介绍在应用Node.js设置MongoDB和Mongoose时应遵循的一些最佳实际。 1.为什么须要Mongoose?为了了解咱们为什么须要Mongoose,咱们先来理解MongoDB(也是一个数据库)在架构层面的工作原理。 你有一个数据库服务器(例如MongoDB社区服务器)你正在运行一个Node.js脚本(作为一个过程)MongoDB服务器在TCP套接字上监听(通常),你的Node.js过程能够应用TCP连贯来连贯它。 然而在TCP之上,MongoDB也有本人的协定来理解客户端(咱们的Node.js过程)到底想要数据库做什么。 对于这种通信,咱们不须要学习咱们在TCP层上要发送的音讯,而是借助一个“驱动”软件将其形象掉,在这里称为MongoDB驱动。MongoDB驱动在这里以npm包的模式提供。 当初请记住,MongoDB 驱动程序负责连贯和形象你的低层通信申请/响应——但作为开发者,这只能让你走到这一步。 因为MongoDB是一个无模式数据库,它为你提供了比初学者所需的更多的性能。更大的权力意味着更大的出错可能性,你须要缩小可在代码中制作的谬误和毁坏表的可能性。 Mongoose是对原生MongoDB驱动(我下面提到的npm包)的一个形象。 抽象化的个别教训法令(我了解的形式)是,每一个抽象化都会损失一些底层操作能力。但这并不一定意味着它是坏的,有时它能进步生产力1000倍以上,因为你基本不须要齐全拜访底层API。 一个好的思路是,你在技术上用C语言和Python创立一个实时聊天利用。作为开发人员,Python的例子将更容易和更快地实现,生产率更高。C可能更有效率,但它会在生产力、开发速度、谬误、解体方面付出微小的代价。另外,在大多数状况下,你不须要领有C给你的能力来实现websockets。 同样,应用Mongoose,你能够限度你的底层API拜访的范畴,但能够开释出很多潜在的收益和良好的DX。 2.如何连贯Mongoose + MongoDB首先,让咱们疾速看看在2020年应该如何用Mongoose连贯到你的MongoDB数据库。 mongoose.connect(DB_CONNECTION_STRING, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false})这种连贯格局确保你正在应用Mongoose的新URL解析器,而且你没有应用任何废除的做法。 3.如何执行Mongoose操作当初咱们先来疾速讨论一下Mongoose的操作,以及你应该如何执行这些操作。 Mongoose为您提供以下两种抉择: 基于游标的(Cursor-based)查问全程检索(Full fetching)查问3.1 基于游标的(Cursor-based)查问基于游标的查问是指一次只解决一条记录,同时一次从数据库中获取一条或一批文档。这是一种在无限的内存环境下解决海量数据的无效形式。 设想一下,你要在1GB/1核云服务器上解析总大小为10GB的文档。你不能获取整个汇合,因为那在你的零碎中不适合。游标是一个很好的(也是惟一的)抉择。 3.2 全程检索(Full fetching)查问这是一种查问类型,你能够一次性取得查问的全副响应。在大多数状况下,这就是你要应用的办法。因而,咱们将在这里次要关注这个办法。 4.如何应用Mongoose模型(Models)模型是Mongoose的超级力量,它们帮忙你执行“schema”规定,并为你的Node代码提供无缝集成到数据库调用中。 第一步是定义一个好的模型: import mongoose from 'mongoose'const CompletedSchema = new mongoose.Schema( { type: { type: String, enum: ['course', 'classroom'], required: true }, parentslug: { type: String, required: true }, slug: { type: String, required: true }, userid: { type: String, required: true } }, { collection: 'completed' })CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })const model = mongoose.model('Completed', CompletedSchema)export default model这是一个间接从codedamn的代码库中删减的例子。这里有一些乏味的事件你应该留神。 ...

December 18, 2020 · 1 min · jiezi

关于mongodb:上海2020线下年会来了-MongoDBMore-than-Document-Database

2020年MongoDB中文社区年初大会 一起重新认识MongoDB! (2021-1-8 上海线下) DB-Engines是对数据库管理系统的受欢迎水平进行排名的网站,近年来,MongoDB在DB-Engines 数据库风行度排行榜稳居榜单前五,在DB-Engines Ranking上Relational环抱中赫然呈现一个Document。 对于MongoDB,不少敌人可能还带着纳闷:MongoDB到底是一个怎么的存在? 为什么MongoDB能够冲破关系型的重围呈现在大家的视线之中,并间断几年位居前五?MongoDB仅仅是一个文档型数据库吗?跟其它数据库相比,MongoDB具备怎么的个性?MongoDB有什么利用场景和解决方案?2020 跨时代的一年,MongoDB中文社区带大家重新认识 MongoDB。 大会速递MongoDB,More than Document Database. 工夫:2021年1月8日(星期五)9:00-17:30 地点:上海市静安区市北高新园区江场三路258号上海市大数据产业基地商务中心三楼宴会厅中厅 大会名额:200名 报名链接: http://hdxu.cn/RInMN 大会优享票:9.9元优享票,分割小芒果支付 (微信ID:mongoingcom) 大会看点为什么MongoDB不仅仅是文档型数据库? 通过MongoDB的定位、倒退历程,纵向Old SQL vs. NoSQL vs. NewSQL的梳理,横向MongoDB与MySQL和TiDB的比照为例,让你理解MongoDB外围业务场景及选型。MongoDB官网专家和MongoDB合作伙伴阿里云带你理解MongoDB最新性能及企业级能力。 MongoDB还能够这么玩?! 火爆了的数据中台,用MongoDB建设居然如此顺畅! 多构造海量数据怎么办?看看MongoDB在视频行业怎么用! 想要轻装上阵做开发?灵便迁徙和扩容?看看MongoDB on Kubernetes怎么玩! MongoDB一手硬核干货分享 MongoDB多样化归档有什么个性?万亿级文档数据库MongoDB集群如何优化?一手硬核干货等你来学习! MongoDB案例征集分享 大家都在怎么用MongoDB?加入MongoDB案例征集流动,分享你的玩法——咱们将从征集的案例中选出最具分享价值案例,并邀请案例分享人到现场分享MongoDB更多玩法! MongoDB中文社区成员颁奖 MongoDB中文社区是国内最大的MongoDB技术交流平台。有哪些成员致力于MongoDB社区建设,为MongoDB爱好者和同行分享本人的教训和常识?2020年,社区将依据成员奉献对突出贡献成员进行表彰。在这里,你也能够进一步理解社区,退出咱们的队列! 大会议程 重新认识MongoDB-收场 MongoDB 历史回顾MongoDB中文社区介绍MongoDB中文社区如何促成MongoDB技术在国内的倒退 嘉宾介绍: 李丹,MongoDB中文社区常委会委员兼北京分会主席。原奇虎360技术专家,现任失去APP运维负责人。近12年从业教训,次要从事运维自动化、混合云平台建设及开源数据库等相干技术畛域的学习与钻研。 重新认识MongoDB- MongoDB 到底是什么样的数据库 MongoDB ,不只是个文档数据库Old SQL vs. NoSQL vs. NewSQL外围业务场景如何选型 嘉宾介绍: 郭远威,资深大数据解决方案征询参谋与架构师,MongoDB中文社区委员,长沙分会主席,多年通信行业大数据研发、布局、征询教训;《大数据存储MongoDB实战指南》作者;阿里云云计算ACP认证专家。 重新认识MongoDB - 企业级能力解析 MongoDB的版本迭代十分快,在往年曾经公布了最新的4.4版本,从4.0到4.2到4.4,随同着许多新的重大性能和优化,本次分享将介绍MongoDB开发者有必要理解的4.x系列几个企业级能力及背地的相干原理,并联合阿里云这些年在云上遇到和总结的一些最佳实际。 ...

December 15, 2020 · 1 min · jiezi

关于mongodb:赵强老师MongoDB中的索引上

索引是进步查问查问效率最无效的伎俩。索引是一种非凡的数据结构,索引以易于遍历的模式存储了数据的局部内容(如:一个特定的字段或一组字段值),索引会按肯定规定对存储值进行排序,而且索引的存储地位在内存中,所在从索引中检索数据会十分快。如果没有索引,MongoDB必须扫描汇合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。 一、索引的基础知识上面以关系型数据库Oracle为例,介绍索引的基本原理,如下图所示: 从上图能够看成,索引的实质其实就相当于是一本书的目录。当查问表中数据的时候,先查问目录(索引)中的行地址,再通过行地址查问到表中的数据,从而进步查问的性能。 下图阐明了在MongoDB中,索引在查问和排序中是如何工作的? 通过这个例子,能够分明的看到索引存储的是一个特定字段或者几个字段的汇合,并且依照肯定的法则排序。当创立汇合的时候,MongoDB主动在\_id上创立一个唯一性索引,因为是唯一性的,所以能够避免反复的\_id值插入到汇合中。通过getIndexes能够查问到MongoDB汇合上的索引信息,如下图所示。 当没有索引的时候,通过查看执行打算,能够看到查问的过程,如下:查问:10号部门,工资小于3000的文档。 那么如何创立一个简略的索引呢?留神从mongoDB 3.0开始ensureIndex被废除,今后都仅仅是db.collection.createIndex的一个别名。 当初在deptno和sal上建设一个索引,并从新查看执行打算:db.emp.createIndex({"deptno":1,"sal":-1}) 留神:除了能够应用explain()生成执行计划外,还能够有几个可选的参数,如下: .explain("allPlansExecution") .explain("executionStats") .explain("queryPlanner") 二、索引的类型一:单键索引(Single Field)单键索引是最一般的索引,与_id索引不同,单键索引不会主动创立。 筹备数据:db.testindex1.insert({"_id":1,"zipcode":1034,"location":{state:"NY",city:"New York"}})在单个列上创立单键索引:db.testindex1.createIndex({"zipcode":1})在嵌套的列上创立单键索引db.testindex1.createIndex({"location:state":1})在内嵌的文档上创立单键索引db.testindex1.createIndex({"location":-1})这样将会把location作为一个整体。三、索引的类型二:多键索引(Multikey Index)多键索引与单键索引创立模式雷同,区别在于字段的值。值具备多个记录,如数组。 如上图,基于汇合上的数组创立多键索引,且数组为内嵌文档。 筹备数据:db.testindex2.insertMany([{ _id: 5, type: "food", item: "aaa", ratings: [ 5, 8, 9 ] },{ _id: 6, type: "food", item: "bbb", ratings: [ 5, 9 ] },{ _id: 7, type: "food", item: "ccc", ratings: [ 9, 5, 8 ] },{ _id: 8, type: "food", item: "ddd", ratings: [ 9, 5 ] },{ _id: 9, type: "food", item: "eee", ratings: [ 5, 9, 5 ] }])上面基于ratings列创立一个多键索引:db.testindex2.createIndex( { ratings: 1 } )查问数组上为5,9的文档db.testindex2.find( { ratings: [ 5, 9 ] } )上面查看其执行打算db.testindex2.find( { ratings: [ 5, 9 ] } ).explain() ...

November 29, 2020 · 1 min · jiezi

关于mongodb:谈谈mongo-driver的连接池

前言对服务器来说, 在单条链接达到吞吐下限之前. 更少的链接意味着更少的上下文切换, 更少的内存耗费(tcp协定栈内存耗费, 应用层的buffer). 所以, 在惯例的索引, 分片, 读写拆散之外, 连接池的设计, 对数据库性能也有很重要的影响.咱们应用的语言没有官网driver, 连接池的实现采纳了固定大小. 在节点不多的状况下问题不大, 当节点数量越来越多时, 问题变得不容忽视. 于是, 参考一下官网driver的实现. mongo offical driveroffical driversc driversourcehttps://github.com/mongodb/mo...commit c99f53b9bcdf5b3756f6c70d8148fbb86015b6f4 documenthttp://mongoc.org/libmongoc/current/connection-pooling.htmlc driver 有 single mode / pooled mode, 显然, 调用线程和链接不会是一对一的关系. 更举荐应用 pooled mode.参考连接池选项http://mongoc.org/libmongoc/current/mongoc_uri_t.html#connection-pool-optionsc driver废除了min_pool_size, 从 mongoc-client-pool.c:333 代码中能够看到 voidmongoc_client_pool_push (mongoc_client_pool_t *pool, mongoc_client_t *client){ ENTRY; BSON_ASSERT (pool); BSON_ASSERT (client); bson_mutex_lock (&pool->mutex); _mongoc_queue_push_head (&pool->queue, client); if (pool->min_pool_size && _mongoc_queue_get_length (&pool->queue) > pool->min_pool_size) { mongoc_client_t *old_client; old_client = (mongoc_client_t *) _mongoc_queue_pop_tail (&pool->queue); if (old_client) { mongoc_client_destroy (old_client); pool->size--; } } mongoc_cond_signal (&pool->cond); bson_mutex_unlock (&pool->mutex); EXIT;}min_pool_size理论含意是, max_pool_size决定了最大链接数, min_pool_size决定了同时维持的最小链接数. 显然, 这个在较大的工作负载时, 会导致频繁的链接创立, 断开, 反而让性能降落. 故不举荐应用. ...

November 29, 2020 · 2 min · jiezi

关于mongodb:mongodb存储引擎wired-tiger学习笔记

从MongoDB 3.2 版本开始,WiredTiger成为MongDB默认的Storage Engine,用于将数据长久化存储到硬盘文件中,WiredTiger提供文档级别(Document-Level)的并发管制,检查点(CheckPoint),数据压缩和本地数据加密( Native Encryption)等性能。个性1. checkpointCheckpoint操作开始时,WiredTiger提供指定工夫点(point-in-time)的数据库快照(Snapshot),该Snapshot出现的是内存中数据的一致性视图。当向Disk写入数据时,WiredTiger将Snapshot中的所有数据以一致性形式写入到数据文件(Disk Files)中。一旦Checkpoint创立胜利,WiredTiger保障数据文件和内存数据是一致性的,因而,Checkpoint担当的是还原点(Recovery Point),Checkpoint操作可能缩短MongoDB从Journal日志文件还原数据的工夫。 当WiredTiger创立Checkpoint时,MongoDB将数据刷新到数据文件(Disk Files)中,在默认状况下,WiredTiger创立Checkpoint的工夫距离是60s,或产生2GB的Journal文件。在WiredTiger创立新的Checkpoint期间,上一个Checkpoint依然是无效的,这意味着,即便MongoDB在创立新的Checkpoint期间遭逢到谬误而异样终止运行,只有重启,MongoDB就能从上一个无效的Checkpoint开始还原数据。 如果要还原在上一个Checkpoint之后执行的批改操作,必须应用Journal日志文件 2. 预写日志journalJournal 是程序写入的日志文件,用于记录上一个Checkpoint之后产生的数据更新,可能将数据库从零碎异样终止事件中还原到一个无效的状态。在数据更新时,先将数据更新写入到journal文件。journal文件会首先写入内存中。所有不超过128kb的日志记录都被缓存。当满足以下条件时,journal会被刷入到磁盘中: - 每100ms- 写操作时加了选项`{j:true}`- 达到创立新的journal文件的阈值(100mb)应用Journal日志文件还原的过程WiredTiger创立Checkpoint,可能将MongoDB数据库还原到上一个CheckPoint创立时的一致性状态,如果MongoDB在上一个Checkpoint之后异样终止,必须应用Journal日志文件,重做从上一个Checkpoint之后产生的数据更新操作,将数据还原到Journal记录的一致性状态,应用Journal日志还原的过程是:1 获取上一个Checkpoint创立的标识值:从数据文件(Data Files)中查找上一个Checkpoint产生的标识值(Identifier);2 依据标识值匹配日志记录:从Journal Files 中搜寻日志记录(Record),查找匹配上一个Checkpoint的标识值的日志记录;3 重做日志记录:重做从上一个Checkpoint之后,记录在Journal Files中的所有日志记录; 3.存储构造数据存储内存page以B+树的构造组织,每个节点为一个page,root page是btree的根节点,internal page是btree的两头索引节点,leaf page是真正存储数据的叶子节点;btree的数据以page为单位按需从磁盘加载或写入磁盘。 Wiredtiger采纳Copy on write(快照)的形式治理批改操作(insert、update、delete),批改操作会先缓存在cache里,checkpoint时,会产生一个新的root page,此时对页面的批改会新调配索引page和数据page。原来的B+树结构理论成为一个快照,由后盾线程执行checkpoint 索引存储Mongo在索引上也辨别为主键索引和非主键索引,这方面与Mysql的聚簇索引和二级索引相似,主键索引贮存主键以及数据内容,非主键索引贮存索引列数据以及主键。 搜寻从根节点开始,因为B树所有节点都会负责数据存储的工作。所以搜寻的工夫复杂度和数据在构造中的地位强相干,最好的状态是数据在根节点中就搜寻到了,能够间接返回,工夫复杂度是O(1)。即从均匀搜寻速度来看MongoDB查问速度会比Mysql更快单纯从存储构造上看,数据的存储散布在各个节点,因而如果须要对数据进行遍历,则须要对整个树进行数据的读取。然而从整体的角度层面来看,MongoDB的数据是结构化存储,所有的数据都能够以聚合的形式进行存储,对于数据的遍历需要并没有关系型数据库那么高。在数据的存储底层,Mongo应用的也是BSON(Binary Json)进行存储,在类型反对和网络传输效率上相较于Json也有了很大的晋升。MongoDB是一种面向文档的数据库管理系统,与传统关系型数据库譬如Mysql不同的是Mysql的数据是扁平化的,构建结构化的数据往往须要通过连表查问在业务中进行组合。而MongoDB是面向文档的数据库,数据在存储阶段就是结构化的,聚合的。即一个文档外部就蕴含了其相关联的子结构 空间局部性原理:如果一个存储器的某个地位被拜访,那么将它左近的地位也会被拜访。B+树叶节点两两相连可大大增加区间拜访性,可应用在范畴查问等,而B-树每个节点 key 和 data 在一起,则无奈区间查找。B+树能够很好的利用局部性原理,若咱们拜访节点 key为 50,则 key 为 55、60、62 的节点未来也可能被拜访,咱们能够利用磁盘预读原理提前将这些数据读入内存,缩小了磁盘 IO 的次数。 当然B+树也可能很好的实现范畴查问。比方查问 key 值在 50-70 之间的节点。

November 26, 2020 · 1 min · jiezi

关于mongodb:mongo简单语句

命令行进入mongo数据库mongo 查看所有数据库show dbs 新建(或已有)fruit数据表并新增数据db.fruits.save({name: 'apple', price: 5}); 查找db.fruits.find({price: 5}) 查看该数据库所有的表db.getCollectionNames()

November 26, 2020 · 1 min · jiezi

关于mongodb:MongoDB-splitChunk引发路由表刷新导致响应慢

MongoDB splitChunk引发路由表刷新导致响应慢MongoDB sharding 实例从 3.4版本 降级到 4.0版本 当前插入性能明显降低,察看日志发现大量的 insert 申请慢日志: 2020-08-19T16:40:46.563+0800 I COMMAND [conn1528] command sdb.sColl command: insert { insert: "sColl", xxx} ... locks: {Global: { acquireCount: { r: 6, w: 2 } }, Database: { acquireCount: { r: 2, w: 2 } }, Collection: { acquireCount: { r: 2, w: 2 }, acquireWaitCount: { r: 1 }, timeAcquiringMicros: { r: 2709634 } } } protocol:op_msg 2756ms日志中能够看到 insert 申请执行获取 collection 上的 IS锁 2次,其中一次产生期待,等待时间为2.7s,这与 insert 申请执行工夫保持一致。阐明性能升高与锁期待有显著的相关性。 ...

November 19, 2020 · 4 min · jiezi

关于mongodb:mongodb-增删查改-数据库实验

mongodb 数据库试验一:减少数据操作1:单条插入:Yelp数据库中的User数据集插入符和如下要求的数据 _id:自定义为本人的班级; user_id:本人的学号+任意字符(多于22个字符取前22位,有余22个字符补充字母,数字或下划线); name:姓名拼音; review_count:任意随机数; yelping_since:试验工夫; 操作2:多条插入: 随机构建4条User数据,有序插入User数据集中; db.user.insert( { _id: 2018211, user_id: 201821057900000000000000000000000, name: "xiao", review_count: 100, "yelping_since": ISODate("2020-11-17 07:58:51"), })the result 2: 插入多项数据: db.user.insertMany( [ { _id: 201821112, user_id: 201811111111111111111111, name: "xiaoxiao", review_count: 1, "yelping_since": ISODate("2020-11-18 07:58:51"), }, { _id: 201821114, user_id: 201822222222222222222, name: "xuexiao", review_count: 344, "yelping_since": ISODate("2030-11-18 07:58:51"), }, { _id: 201821117, user_id: 201833333333333333333, name: "xiaoxiao", review_count: 56, "yelping_since": ISODate("2020-11-19 07:58:51"), },] )the result ...

November 19, 2020 · 1 min · jiezi

关于mongodb:你知道MongoDB的10种索引吗

为什么要有索引查问快! 查问快! 查问快! MongoDB的10种索引?创立索引语法: db.<collection_name>.createIndex( <key and index type specification>, <options> )咱们的record Collection存在如下document { "_id": ObjectId("570c04a4ad233577f97dc459"), "score": 1034, "userId": 123, "location": { state: "ZH", city: "ChengDu" }, "addr": [ {zip: "10036", detail: "高家村五组"}, {zip: "94231", detail: "王家镇三组701"} ]}_id索引mongodb会主动为document中的_id字段加上索引,所以能用_id查问就用_id查问 单键索引db.records.createIndex( { score: 1 })复合索引db.records.createIndex( { userId: 1, score: 1})多值索引db.records.createIndex( { "addr.zip": 1 })天文空间索引MongoDB为坐标立体查问提供了专门的索引,称为天文空间索引。这种查问须要两个维度,所以参数是2d。 db.map.ensureIndex({"gps" : "2d"});gps键的值必须是某种模式的一对值:一个蕴含2个元素的数组或者是蕴含2个键的内嵌文档 {"gps" : [0,100]}{"gps" : {"x" : -30 , "y" : 30}}{"gps" : {"latitude" : -180, "longitude" : 180 }}至于键名能够随便。默认状况下,天文空间索引假如值范畴是-180~180(对经纬度来说很不便),咱们同样能够应用参数来对索引进行定制,比方上面的星图 ...

November 12, 2020 · 1 min · jiezi

关于mongodb:Windows安装Mongo单机开启复制集

装置Mongo:1、下载mongo,除了自定义门路和Install MongoDb Compass不要勾选(这是下图形化界面,基本下不动),其它默认配置,一路next即可。2、配置环境变量:D:Program FilesMongoDBServer4.4bin3、在装置目录的bin下创立两目录data,log 【其实这个文件夹地位能够轻易指定,只有在mongo.config中指明就行】,并在log中创立文件mongo.log4、在bin同级目录下创立文件:mongo.config【其实这个文件地位也能够变动,只须要在启动命令中指明即可】mongo.confi内容如下:replSet=rs,指定复制集为rs.留神,如果要外网能连mongo,须要指定bind_ip为0.0.0.0; dbpath = D:\Program Files\MongoDB\Server\4.4\data\dblogpath = D:\Program Files\MongoDB\Server\4.4\data\log\mongo.logport=27017journal=truereplSet=rs5、以config形式启动mongo 服务: mongod --config "D:\Program Files\MongoDB\Server\4.4\mongo.config"6、登录mongo:这里因为没设置登录明码啥的,就间接登录了 mongo -port 270177、执行初始化:进入local库,执行初始化: use localrs.initiate({ _id: "rs", members: [{_id:0,host:"127.0.0.1:27017"}]})此时:能够看出rs:SECONDARY>变为rs:PRIMARY>,就阐明配置胜利了

October 23, 2020 · 1 min · jiezi

关于mongodb:MongoDB查询之高级操作多条件查询正则匹配查询等等

MongoDB查问之高级操作语法介绍MongoDB查问文档应用find()办法,同时find()办法以非结构化的形式来显示所有查问到的文档。 -- 1.根本语法db.collection.find(query, projection) -- 返回所有合乎查问条件的文档db.collection.findOne(query, projection) -- 返回第一个合乎查问条件的文档-- query:可选,查问条件操作符,用于指定查问条件-- projection:可选,投影操作符,用来指定须要返回的键(默认省略)-- 例1:查问users汇合中年龄为18的所有文档db.users.find({age: 18})-- 2.如果须要以易读的形式来察看数据,能够应用pretty()办法db.collection.find(query, projection).pretty()AND 条件与 OR 条件MongoDB的find()办法能够传入多个键,每个键以逗号隔开,这样即可起到SQL的AND条件 -- 1.AND条件根本语法db.collection.find({key1:value1, key2:value2})-- 例1:查问users汇合中年龄为18的女生的所有文档db.users.find({age: 18, sex: 'girl'})-- 2.OR条件根本语法db.collection.find({ $or: [ {key1: value1}, {key2:value2} ]})-- 例2:查问users汇合中年龄为18或性别为女生的所有文档db.users.find({ $or: [ {age: 18}, {sex: 'girl'} ]})条件操作符条件操作符用解决条件关系以从MongoDB中查问符合条件的文档数据,条件操作符如下: 大于:$gt小于:$lt大于等于:$gte小于等于:$lte-- 查问users汇合中年龄大于18岁的文档数据db.users.find({age : {$gt : 18}})-- 查问users汇合中年龄小于18岁的文档数据db.users.find({age : {$lt : 18}})-- 查问users汇合中年龄大于等于18岁的文档数据db.users.find({age : {$gte : 18}})-- 查问users汇合中年龄大于等于18岁的文档数据db.users.find({age : {$lte : 18}})$type操作符$type操作符是基于BSON类型来检索汇合中匹配的数据类型,MongoDB中能够应用查问的数据类型如下表: 类型$type代表数字阐明Double164位浮点数String2字符串类型Object3对象类型Array4数组类型Binary Data5二进制数据类型Objectid7对象id类型Boolean8布尔类型Date9日期类型Null10用于示意空值或不存在的字段Regular Expression11正则表达式类型JavaScript13JavaScript代码JavaScript (with scope)15带作用域的JavaScript代码32-bit integer1632位整数Timestamp17工夫戳类型64-bit integer1864位整数Min key-1最小键Max key127最大键上面我将应用$type,作为查问条件举例说明: ...

October 13, 2020 · 1 min · jiezi

关于mongodb:MongoDB特定场景性能数十倍提升优化实践记一次MongoDB核心集群雪崩故障

1. 问题背景某外围JAVA长连贯服务应用MongoDB作为次要存储,客户端数百台机器连贯同一MongoDB集群,短期内呈现屡次性能抖动问题,此外,还呈现一次“雪崩”故障,同时流量霎时跌零,无奈主动复原。本文剖析这两次故障的根本原因,包含客户端配置应用不合理、MongoDB内核链接认证不合理、代理配置不全等一系列问题,最终通过多方致力确定问题本源。 该集群有十来个业务接口拜访,每个接口部署在数十台业务服务器下面,拜访该MongoDB机器的客户端总数超过数百台,局部申请一次拉取数十行甚至百余行数据。 该集群为2机房同城多活集群(选举节不耗费太多资源,异地的第三机房来部署选举节点),架构图如下: 从上图能够看出,为了实现多活,在每个机房都部署有对应代理,对应机房客户端链接对应机房的mongos代理,每个机房多个代理。代理层部署IP:PORT地址列表(留神:不是实在IP地址)如下: A机房代理地址列表:1.1.1.1:111,2.2.2.2:1111,3.3.3.3:1111 B机房代理地址列表:4.4.4.4:1111,4.4.4.4:2222 A机房三个代理部署在三台不同物理机,B机房2个代理部署在同一台物理机。此外,A机房和B机房为同城机房,跨机房拜访时延能够疏忽。 集群存储层和config server都采纳同样的架构:A机房(1主节点+1从节点) + B机房(2从节点)+C机房(1个选举节点arbiter),即2(数据节点)+2(数据节点)+1(选举节点)模式。 该机房多活架构能够保障任一机房挂了,对另一机房的业务无影响,具体机房多活原理如下: 如果A机房挂掉,因为代理是无状态节点,A机房挂掉不会影响B机房的代理。如果A机房挂掉,同时主节点在A机房,这时候B机房的2个数据节点和C机房的选举节点一共三个节点,能够保障新选举须要大于一半以上节点这个条件,于是B机房的数据节点会在短时间内选举出一个新的主节点,这样整个存储层拜访不受任何影响。本文重点剖析如下6个疑难点: 为什么突发流量业务会抖动?为什么数据节点没有任何慢日志,然而代理负载缺100%?为何mongos代理引起数小时的“雪崩”,并且长时间不可复原?为何一个机房代理抖动,对应机房业务切到另一个机房后,还是抖动?为何异样时候抓包剖析,客户端频繁建链断链,并且同一个链接建链到断链距离很短?实践上代理就是七层转发,耗费资源更少,相比mongod存储应该更快,为何mongod存储节点无任何抖动,mongos代理缺有抖动?2. 故障过程2.1 业务偶然流量顶峰,业务抖动?该集群一段时间内有屡次短暂的抖动,当A机房客户端抖动后,发现A机房对应代理负载很高,于是切换A机房拜访B机房代理,然而切换后B机房代理同样抖动,也就是多活切换没有作用,具体过程剖析如下。 2.1.1 存储节点慢日志剖析首先,剖析该集群所有mongod存储节点零碎CPU、MEM、IO、load等监控信息,发现一切正常,于是剖析每个mongod节点慢日志(因为该集群对时延敏感,因而慢日志调整为30ms),剖析后果如下: 从上图能够看出,存储节点在业务抖动的时候没有任何慢日志,因而能够判断存储节点一切正常,业务抖动和mongod存储节点无关。 2.1.2 mongos代理剖析存储节点没有任何问题,因而开始排查mongos代理节点。因为历史起因,该集群部署在其余平台,该平台对QPS、时延等监控不是很全,造成晚期抖动的时候监控没有及时发现。抖动后,迁徙该平台集群到oppo自研的新管控平台,新平台有具体的监控信息,迁徙后QPS监控曲线如下: 每个流量徒增工夫点,对应业务监控都有一波超时或者抖动,如下: 剖析对应代理mongos日志,发现如下景象:抖动工夫点mongos.log日志有大量的建链接和断链接的过程,如下图所示: 从上图能够看出,一秒钟内有几千个链接建设,同时有几千个链接断开,此外抓包发现很多链接短期内即断开链接,景象如下(断链工夫-建链工夫=51ms, 局部100多ms断开): 对应抓包如下: 此外,该机器代理上客户端链接低峰期都很高,甚至超过失常的QPS值,QPS大概7000-8000,然而conn链接缺高达13000,mongostat获取到监控信息如下: 2.1.3 代理机器负载剖析每次突发流量的时候,代理负载很高,通过部署脚本定期采样,抖动工夫点对应监控图如下图所示: 从上图能够看出,每次流量顶峰的时候CPU负载都十分的高,而且是sy%负载,us%负载很低,同时Load甚至高达好几百,偶然甚至过千。 2.1.4 抖动剖析总结从下面的剖析能够看出,某些工夫点业务有突发流量引起零碎负载很高。根因真的是因为突发流量吗?其实不然,请看后续剖析,这其实是一个谬误论断。没过几天,同一个集群雪崩了。 于是业务梳理突发流量对应接口,梳理进去后下掉了该接口,QPS监控曲线如下: 为了缩小业务抖动,因而下掉了突发流量接口,尔后几个小时业务不再抖动。当下掉突发流量接口后,咱们还做了如下几件事件: 因为没找到mongos负载100%真正起因,于是每个机房扩容mongs代理,放弃每个机房4个代理,同时保障所有代理在不同服务器,通过分流来尽量减少代理负载。告诉A机房和B机房的业务配置上所有的8个代理,不再是每个机房只配置对应机房的代理(因为第一次业务抖动后,咱们剖析MongoDB的java sdk,确定sdk平衡策略会主动剔除申请时延高的代理,下次如果某个代理再出问题,也会被主动剔除)。告诉业务把所有客户端超时工夫进步到500ms。然而,心里始终有很多纳闷和悬念,次要在以下几个点: 存储节点4个,代理节点5个,存储节点无任何抖动 ,反而七层转发的代理负载高?为何抓包发现很多新连贯几十ms或者一百多ms后就断开连接了?频繁建链断链?为何代理QPS只有几万,这时代理CPU耗费就十分高,而且全是sy%零碎负载?以我多年中间件代理研发教训,代理耗费的资源很少才对,而且CPU只会耗费us%,而不是sy%耗费。2.2 同一个业务几天后“雪崩”了好景不长,业务下掉突发流量的接口没过几天,更重大的故障呈现了,机房B的业务流量在某一时刻间接跌0了,不是简略的抖动问题,而是业务间接流量跌0,零碎sy%负载100%,业务简直100%超时重连。 2.2.1 机器系统监控剖析机器CPU和零碎负载监控如下: 从上图能够看出,简直和后面的突发流量引起的零碎负载过高景象统一,业务CPU sy%负载100%,load很高。登陆机器获取top信息,景象和监控统一。 同一时刻对应网络监控如下: 磁盘IO监控如下: 从下面的系统监控剖析能够看出,出问题的时间段,零碎CPU sy%、load负载都很高,网络读写流量简直跌0,磁盘IO一切正常,能够看出整个过程简直和之前突发流量引起的抖动问题完全一致。 2.2.2 业务如何复原第一次突发流量引起的抖动问题后,咱们扩容所有的代理到8个,同时告诉业务把所有业务接口配置上所有代理。因为业务接口泛滥,最终B机房的业务没有配置全副代理,只配置了原先的两个处于同一台物理机的代理(4.4.4.4:1111,4.4.4.4:2222),最终触发MongoDB的一个性能瓶颈(详见前面剖析),引起了整个MongoDB集群”雪崩” 最终,业务通过重启服务,同时把B机房的8个代理同时配置上,问题得以解决。 2.2.3 mongos代理实例监控剖析剖析该时间段代理日志,能够看出和2.1同样得景象,大量的新键连贯,同时新连贯在几十ms、一百多ms后又敞开连贯。整个景象和之前剖析统一,这里不在统计分析对应日志。 此外,剖析过后的代理QPS监控,失常query读申请的QPS拜访曲线如下,故障时间段QPS简直跌零雪崩了: Command统计监控曲线如下: ...

October 10, 2020 · 1 min · jiezi

关于mongodb:mongodb复制集总结

mongodb正本集应用复制能够将数据正本保留到多台服务器上,即便一台或多台服务器出错,也能够保障应用程序失常运行和数据安全。在mongodb中,创立一个正本集之后就能够应用复制性能了。正本集是一组服务器,其中有一个主服务器,用于解决客户端申请;还有多个备份服务器,用于保留主服务器的数据正本。如果主服务器解体了,备份服务器会主动将其中一个成员降级为新的主服务器。 客户端不能在备份节点执行写操作默认状况下,客户端不能从备份节点读取数据。在备份节点上显式地执行setSlaveOK之后,客户端就能够从备份节点读取数据了。 正本集中很重要的一个概念是大多数:抉择主节点时须要由大多数决定,主节点只有在失去大多数反对时能力持续作为主节点。写操作被复制到大多数成员时这个写操作就是平安的。这里的大多数被定义为正本集中一半以上的成员。 假如一个蕴含5个成员的正本集,其中3个成员不可用,依然有2个能够失常工作,残余的2个成员曾经无奈达到正本集大多数的要求(大多是为3个),所以它们无奈选举主节点。如果这2个成员中有一个是主节点,当它留神到它无奈失去大多数成员反对时,就会从主节点上退位。几秒钟之后,这个正本集中会蕴含2个备份节点和3个不可达节点。 选举机制当一个备份节点无奈与主节点连通时,它就会分割其余的正本集成员将本人选举为主节点。其余成员会做几项感性查看: 其余成员本身是否能和主节点连通心愿被选举为主节点的备份节点数据是否最新有没有其余更高优先级的成员被选举为主节点如果要求被选举为主节点的成员可能失去正本集中大多数成员的投票,它就会成为主节点。如果大多数成员中只有一个否决了本次选举,选举就会被勾销。如果成员发现任何起因,表明以后心愿成为主节点的成员不应该成为主节点,那么它就会否决此次的选举。 一张否决票相当于10000张赞成票,即值为-10000复制操作是严格按工夫排序的,所以候选人的最初一条操作要比它能连通的其余所有成员更晚(或者与其余成员相等)。 成员配置选项仲裁者很多人的应用程序使用量比拟小,并不想保留三份数据正本。两份正本曾经足够了,保留三份正本的话纯正是节约人力,物力,财力。对于这种部署,mongodb反对一种非凡类型的成员,成为仲裁者。仲裁者的惟一作用就是参加选举。仲裁者并不保留数据,也不会为客户端提供服务,它只是为了帮忙具备两个成员的正本集可能满足大多数这个条件。 因为仲裁者并不需要履行传统mongod服务器的责任,所以能够将仲裁者作为轻量级过程,运行在配置比拟差的服务器上。如果能够,能够将仲裁者放在独自的故障域中,与其余成员离开。这样他就能够以内部视角来对待正本集中的成员了。 能够应用rs.addArb("$ip:$port")或在成员配置中指定arbiterOnlt选项rs.add({"_id":$id, "host":"$ip:$port", "arbiterOnly":true})。 成员一旦以仲裁者的身份增加到正本集中,它就永远只能是仲裁者,无奈将仲裁者重新配置为非仲裁者,反之亦然。 应用仲裁者的另一个益处是,如果节点领有的节点数是偶数,仲裁者能够投出决定输赢的要害一票。 优先级优先级用于示意一个成员渴望成为主节点的水平,取值范畴是1-100,默认是1。将优先级设为0有非凡含意:优先级为0的成员永远不可能成为主节点,这样的成员被称为被动成员。领有最高优先级的成员会优先选举为主节点(只有它可能失去汇合中大多数成员的赞成票,并且数据是最新的) 暗藏成员客户端不会向暗藏成员发送申请,暗藏成员也不会作为复制源。因而,很多人会将不够弱小的服务器或备份服务器暗藏起来。只有优先级为0的成员能力被暗藏。即设置priority=0和hidden=true 提早备份节点数据可能会因为人为谬误而蒙受毁灭性的毁坏,为了避免这类问题,能够应用slaveDelay设置一个提早的备份节点。提早备份节点会比主节点提早指定的工夫(秒),这是无意为之的。这样,如果有人不小心捣毁了你的主汇合,还能够将数据从先前的备份中恢复过来。slaveDelay要求成员的优先级是0,如果利用会将读申请路由到备份节点,应该将提早备份节点暗藏掉,免得读申请被路由到提早备份节点。 不创立索引的成员有时备份节点并不需要与主节点领有雷同的索引,甚至能够没有索引。如果某个备份节点的用处仅仅是解决数据备份或者离线的批量工作,那么你可能心愿在它的成员配置中指定"buildIndexes":false。这个选项能够阻止备份节点创立索引。这是一个永恒选项,这个成员将永远无奈复原为能够创立索引的成员。要求成员的优先级为0。 同步的过程mongodb的复制性能是应用操作日志oplog实现的,操作日志蕴含了主节点的每一次写操作。oplog是主节点的local数据库中的一个固定汇合。备份节点通过查问这个汇合就能够晓得须要进行复制的操作。 每个备份节点都保护着本人的oplog,记录着每一次从主节点复制数据的操作。这样,每个成员都能够作为同步源提供给其余成员应用。 备份节点从以后应用的同步源中获取须要执行的操作,而后在本人的数据集上执行这些操作,最初再将这些操作写入本人的oplog。如果某个备份节点挂掉了,当它重新启动后,就会主动从oplog中最初一个操作开始进行同步。因为复制操作的过程是先复制数据再写入oplog,所以备份节点可能会在曾经同步过的数据上再次执行复制操作。mongodb在设计之初就思考到了这种状况:将oplog的同一个操作执行屡次与只执行一次的成果是一样的。 因为oplog的大小是固定的,它只能保留特定数量的操作日志。如果单个操作会影响多个文档,例如db.coll.remove(),删除了10000个文档,那么oplog中就会有10000条操作日志,每条日志对应一个被删除的文档。如果执行大量的批量操作,oplog很快就会被填满。 抉择同步源MongoDB 默认是采取级联复制的架构,就是默认不肯定抉择主库作为本人的同步源,如果不想让其进行级联复制,能够通过 chainingAllowed 参数来进行管制。在级联复制的状况下,你也能够通过 replSetSyncFrom 命令来指定你想复制的同步源。所以这里说的同步源其实绝对于从库来说就是它的主库。那么同步源的选取流程是怎么的呢?MongoDB 从库会在正本集其余节点通过以下条件筛选合乎本人的同步源。 如果设置了 chainingAllowed 为 false,那么只能选取主库为同步源找到与本人 ping 工夫最小的并且数据比本人新的节点(在正本集初始化的时候,或者新节点退出正本集的时候,新节点对正本集的其余节点至多 ping 两次)该同步源与主库最新 optime 做比照,如果提早主库超过 30s,则不抉择该同步源。在第一次的过滤中,首先会淘汰比本人数据还旧的节点。如果第一次没有,那么第二次须要算上这些节点,避免最初没有节点能够做为同步源了。最初确认该节点是否被禁止参加选举,如果是则跳过该节点。通过上述筛选最初过滤出来的节点作为新的同步源。 其实 MongoDB 同步源在除了在 Initial Sync 和增量复制 的时候选定之后呢,并不是始终是稳固的,它可能在以下状况下进行变更同步源: ping 不通本人的同步源本人的同步源角色发生变化本人的同步源与正本集任意一个节点提早超过 30s删除除local以外的所有数据库全量同步在创立的汇合的时候同时创立了索引(与主库一样),在 MongoDB 3.4 版本之前只创立 _id 索引,其余索引期待数据 copy 实现之后进行创立。在创立汇合和拷贝数据的同时,也将 oplog 拷贝到本地 local 数据库中,等到数据拷贝实现之后,开始利用本地 oplog 数据。克隆数据是耗时操作,如果克隆实现后,新成员数据同步速度赶不上同步源的变动速度,同步源可能会将新成员须要复制的某些数据oplog笼罩掉。 备份节点远远落后于同步源以后的操作,那么这个备份节点就是古老的。当一个备份节点古老之后,它会查看正本集中的其余成员,如果某个成员的oplog足够详尽,能够用于解决那些落下的操作,就从这个成员处进行同步。如果任何一个成员的oplog都没有参考价值,那么这个成员上的复制操作就会停止,这个成员须要从新进行全量同步。 增量同步Sencondary 初始化同步实现之后,开始增量复制,通过 produce 线程在 Primary oplog.rs 汇合上建设 cursor,并且实时申请获取数据。Primary 返回 oplog 数据给 Secondary。Sencondary 读取到 Primary 发送过去的 oplog,将其写入到队列中。Sencondary 的同步线程会通过 tryPopAndWaitForMore 办法始终生产队列,当每次达到肯定的条件之后,条件如下: ...

October 6, 2020 · 1 min · jiezi

关于mongodb:性能最佳实践MongoDB索引

欢送浏览MongoDB性能最佳实际系列博客的第三篇。 在本系列中,咱们将探讨在大规模数据下实现高性能,须要在许多重要维度上进行思考的关键因素,其中包含: 数据建模和内存大小调整(工作集)查问模式和剖析索引分片事务和读/写关注硬件和操作系统配置基准测试依据咱们在过来的15年里为多个不同数据库供应商工作的教训,能够必定地说,如何定义适合的索引是技术支持团队必须解决的首要性能问题。 所以接下来会介绍一些有帮忙的最佳实际。 MongoDB中的索引在所有数据库中,索引都无效地反对查问的执行。如果没有它们,数据库就必须扫描汇合或表中的每个文档,而后在其中抉择与查问语句相匹配的那些。如果存在适合的索引,数据库就能够应用该索引来限度它必须查看的文档数量。 MongoDB提供了十分多的索引类型和个性,包含特定于不同语言的排序功能,以反对对数据简单的拜访模式。MongoDB索引能够按需创立和删除以适应一直变动的应用程序需要和查问模式,并且它们能够在文档中的任何字段上申明,包含嵌套在数组中的字段。 上面咱们来讨论一下如何在MongoDB中充沛地应用索引。 应用复合索引复合索引是由几个不同字段组成的索引。例如,在对姓名进行查问时,相比于在“姓氏”上建设一个索引,再在“名字”上建设另一个索引,创立同时蕴含“姓”和“名”的索引通常是最无效的。而且复合索引依然能够用于筛选仅指定姓氏的查问。 遵循ESR规定对于复合索引,这个教训法令对于确定索引中字段的程序是十分有帮忙的: 首先,增加针对等值(Equality)查问的字段。接下来要索引的字段应该反映出查问的排序(Sort)程序。最初要增加的字段示意要拜访的数据的范畴(Range)。尽可能应用笼罩查问笼罩查问能够间接从索引返回后果,而不须要拜访源文档,因而十分高效。 想要查问被笼罩,须要过滤、排序和/或返回给客户端的所有字段都必须呈现在索引中。要确定一个查问是否是笼罩查问,能够应用explain()办法。如果explain()输入中totalDocsExamined字段显示为0,则表明此查问被索引笼罩。更多信息请参阅文档中explain后果的局部。 在试图实现笼罩查问时,一个常见的问题是_id字段总是默认返回。须要显式地将其从查问后果中排除,或将其增加到索引中。 在分片集群中,MongoDB在外部须要拜访片键字段。这意味着仅当片键是索引的一部分时才可能进行笼罩查问。无论如何,这通常都是一个很好的形式。 在低基数字段上要小心进行索引对于具备大量惟一值(基数低)的字段进行查问会返回较大的后果集。在复合索引中能够蕴含基数较低的字段,然而组合字段的值应该具备较高的基数。 打消不必要的索引索引是资源密集型的:即便在MongoDB的WiredTiger存储引擎中应用压缩,它们也会耗费RAM和磁盘。在更新字段时,必须保护关联的索引,这会带来额定的CPU和磁盘I/O开销。 MongoDB提供了工具来帮忙了解索引的应用,咱们将在文章前面进行介绍。 不要用通配符索引来代替基于工作负载的索引布局对于具备许多非凡查问模式或解决高度多态文档构造的工作负载,通配符索引提供了很多额定的灵活性。能够定义一个过滤器来主动索引汇合中所有匹配的字段、子文档和数组。 与其余索引一样,通配符索引也须要存储和保护,因而它们会给数据库减少开销。如果事后晓得应用程序的查问模式,那么应该对查问所拜访的特定字段应用更有选择性的索引。 应用文本搜寻来匹配字段内的单词惯例索引对于匹配整个字段值很有用。但如果只想匹配蕴含大量文本字段中的特定单词,那么能够应用文本索引。 如果你在Atlas服务中运行MongoDB,能够思考应用Atlas全文搜寻,它提供了一个与MongoDB数据库集成的齐全托管的Lucene索引。FTS提供了更高的性能和更大的灵活性来对数据进行过滤、排名及排序,为用户疾速找出最相干的后果。 应用局部索引通过只蕴含那些会通过索引拜访的文档来缩小索引的大小和性能开销。例如,在orderID字段上创立一个局部索引,该索引只蕴含orderStatus为"In progress"的订单文档,或者仅为存在emailAddress字段的文档创立索引。 利用多键索引查问数组如果你的查问模式须要拜访单个数组元素,请应用多键索引。MongoDB会为数组中的每个元素创立一个索引键,并且能够同时在蕴含标量值和内嵌文档的数组上结构。 防止应用非左锚定或无根的正则表达式索引是按值排序的。前导通配符效率较低,可能会导致全索引扫描。如果表达式中有足够的辨别大小写的前导字符,那么前面追随通配符通常效率能够比拟高。 防止应用大小写不敏感的正则表达式如果应用正则表达式的惟一起因是大小写不敏感,请应用大小写不敏感索引,因为这样更快。 应用WiredTiger存储引擎中可用的索引优化如果你应用的是自治理的MongoDB,能够抉择在它们本人独自的卷上搁置索引,从而容许更快的磁盘分页和更少的争用。更多信息请参见wiredTiger选项。 应用查问打算在上一篇查问模式和剖析中,咱们介绍了MongoDB的查问打算的应用,这是查看单个查问索引笼罩状况的最佳工具。 依据查问打算,MongoDB提供了可视化工具来进一步帮忙进步对索引的了解,并提供了对于要增加哪些索引的智能倡议。 应用MongoDB Compass和Atlas数据浏览器进行索引笼罩状况的可视化作为MongoDB的收费GUI,Compass提供了许多个性来帮忙优化查问性能,包含数据模式浏览和查问打算可视化——本系列之前的文章介绍过这两方面内容。 Compass中的索引选项卡为你的工具库增加了另一个工具。它列出了一个汇合的现有索引,显示出索引的名称和键,以及它的类型、大小和任何非凡属性。在索引选项卡中还能够依据须要增加和删除索引。 图1:应用MongoDB Compass治理索引 查看索引的应用状况是十分有用的个性,它能够显示索引的应用频率。索引过多对性能的侵害简直和索引过少是一样的,这使得此个性在帮忙辨认和删除未应用的索引方面十分有价值。这有助于开释工作集空间,并打消因为保护索引而带来的数据库开销。 如果你在齐全托管的Atlas服务中运行MongoDB,那么数据浏览器中的索引视图能够提供与Compass雷同的性能,而无需通过独自的工具连贯到数据库。 还能够应用$indexStats聚合管道来获取索引的统计信息。 自动化的索引倡议即便能够应用MongoDB工具提供的所有这些遥测技术,你依然要负责提取和剖析所需的数据,以决定应该增加哪些索引。 MongoDB Atlas和Ops Manager通过Performance Advisor缩小了这方面的工作,它监控执行工夫超过100ms的查问,并主动对新的索引提出倡议来进步性能。 被举荐的索引会与依据查问形态分组的示例查问(即具备相似谓词构造、排序和投影的查问)一起提供,这些查问针对会从倡议索引中获益的汇合运行。Performance Advisor不会对Atlas集群的性能产生负面影响。 如果你感觉这个倡议不错,那么能够主动履行新的索引,而不会导致任何的应用程序停机工夫。 接下来的内容这就是本期的性能最佳实际系列。MongoDB University提供收费的、基于web的MongoDB性能培训课程。这是理解更多对于索引性能的十分好的路径。 下一篇将介绍分片。 本文译自: Performance Best Practices: Indexing 译者:牟天垒 MongoDB中文社区翻译委员 MongoDB性能最佳实际系列: 性能最佳实际:MongoDB数据建模和内存大小调整 性能最佳实际:MongoDB查问模式和剖析 MongoDB模式构建系列: 利用模式进行构建第一讲——多态模式 利用模式进行构建第二讲——属性模式 利用模式进行构建第三讲——桶模式 利用模式进行构建第四讲——异样值模式 利用模式进行构建第五讲——计算模式 利用模式进行构建第六讲——子集模式 ...

October 5, 2020 · 1 min · jiezi

关于mongodb:Mongodb异常关闭再次启动报错

mongodb非正常退出,下次启动时会报错。有的说法是将mongod.lock文件删除就能够了。 如果将mongod.lock文件删除解决不了问题,能够尝试删除lock文件后,先执行 ./bin/mongod --repair --dbpath /…/data/--repairpath /home/test/bakdata /home/test/bakdata是本人建设的寄存备份数据的目录, /…/data/是mongodb存放数据文件的目录。 这个指令执行胜利后,再失常启动mongodb,就能够胜利了。

October 3, 2020 · 1 min · jiezi

关于mongodb:推荐最新版MongoDB中文手册发布-翻译持续招募中

MongoDB是专为可扩展性,高性能和高可用性而设计的数据库。它能够从单服务器部署扩大到大型、简单的多数据中心架构。利用内存计算的劣势,MongoDB可能提供高性能的数据读写操作。MongoDB的本地复制和主动故障转移性能使应用程序具备企业级的可靠性和操作灵活性。 _MongoDB中文手册是MongoDB官网文档的汉化版。本中文手册基于MongoDB 4.2版本用户手册,并一直与最新版放弃同步。_中文手册翻译工作量大,目前手册翻译已有315+页,翻译实现尚有时日。而泛滥mongoers在应用过程对中文手册的需要呼声很高,咱们决定不必那么完满,在实现一部分翻译之时就能够公布进去应用,同时激励更多mongoers退出进来,一起共创首份完整版MongoDB中文用户手册! MongoDB中文社区是一个MongoDB中文爱好者交流平台,由来自MongoDB官网和国内前沿IT互联网公司的MongoDB专家组成,着力于为更多mongoers带来MongoDB最新资讯和一手实际干货!官网文档翻译为MongoDB中文社区的一个版块,次要由社区翻译小组进行保护。心愿咱们的致力能为大家带来权威牢靠的中文文档! 内容阐明本手册文档版本基于4.2版本,一直与官网最新版放弃同步。保护地址mongodb-china Github:https://github.com/mongodb-china/MongoDB-CN-Manual中文文档在线浏览MongoDB中文社区文档在线浏览(https://docs.mongoing.com/) ; 上海锦木文档在线浏览(https://docs.jinmu.info/MongoDB-Manual-zh/)在线浏览问题报告如果您发现问题,请在 MongoDB-Manual-zh/issues上提 issue:https://github.com/mongodb-china/MongoDB-CN-Manual/issues文档翻译贡献者名单MongoDB中文社区&上海锦木已实现大部分翻译,欢送更多mongoers退出:https://github.com/mongodb-china/MongoDB-CN-Manual/blob/master/List-of-contributors.md如何退出文档翻译点击文档翻译认领列表退出文档翻译:https://github.com/mongodb-china/MongoDB-CN-Manual/blob/master/Document-translation-claim-list.md文档翻译标准参见奉献指南:https://github.com/mongodb-china/MongoDB-CN-Manual/blob/master/CONTRIBUTING.md退出翻译权利翻译内容将由MongoDB中文社区专家进行审核,审核通过后将保留署名权公布到本手册及MongoDB中文社区微信内容平台。LICENSE本我的项目为署名-非商业性应用-雷同形式共享 CC BY-NC-SA 4.0 中文手册目录MongoDB中文手册|官网文档中文版 阐明 MongoDB用户手册阐明 MongoDB简介 装置 MongoDB The mongo Shell MongoDB CRUD 操作 MongoDB聚合 MongoDB数据模型 MongoDB事务 MongoDB索引 MongoDB平安 MongoDB变更流 MongoDB复制 MongoDB分片 MongoDB治理 MongoDB存储 MongoDB参考 MongoDB常见问题解答 致谢本中文手册由MongoDB中文社区和社区合作伙伴锦木信息联结进行翻译,在此特别感谢社区翻译小组成员的奉献和翻译委员们不辞辛苦的校对,以及锦木信息技术团队小伙伴大量的的翻译和手册编制工作。心愿咱们的工作成绩可能为大家提供更便捷的帮忙! 在此也号召更多的mongoers退出到咱们中文手册的翻译工作中来!对更多翻译交换感兴趣,可分割小芒果(微信ID:mongoingcom)申请加入社区翻译小组。 文档在社区的查看形式PC端:进入MongoDB中文社区网站mongoing.com,点击导航栏“MongoDB中文手册”第一个选项“中文用户手册”; 挪动端:关注“Mongoing中文社区”微信公众号,点击菜单栏两头栏目“干货精选”第一个选项“中文手册”; 其它: 进入社区技术交换群,请增加小芒果微信(微信ID:mongoingcom),发送关键词“mongo”由小芒果邀请您进群;社区长期接管MongoDB相干优良文章,向社区投稿请分割小芒果,或者间接在社区网站mongoing.com编辑,通过审核后将间接公布;分割锦木获取更多业余技术支持,请拜访锦木信息网站http://www.jinmuinfo.com/对于MongoDB中文社区MongoDB中文社区—MongoDB爱好者技术交流平台 资源列表举荐资源入口MongoDB中文社区官网https://mongoing.com/微信服务号 ——最新资讯和优质文章Mongoing中文社区(mongoing-mongoing)微信订阅号 ——公布文档翻译内容MongoDB中文用户组(mongoing123)官网微信号 —— 官网最新资讯MongoDB数据库(MongoDB-China)MongoDB中文社区组委会成员介绍https://mongoing.com/core-team-membersMongoDB中文社区翻译小组介绍https://mongoing.com/translatorsMongoDB中文社区微信技术交换群增加社区助理小芒果微信(ID:mongoingcom),并备注 mongoMongoDB中文社区会议及文档资源https://mongoing.com/resourcesMongoDB中文社区大咖博客基础知识 性能优化 原理解读 运维监控 最佳实际MongoDB白皮书https://mongoing.com/mongodb-download-white-paper MongoDB初学者教程-7天入门https://mongoing.com/mongodb-beginner-tutorial社区活动告诉邮件订阅https://sourl.cn/spszjN

September 14, 2020 · 1 min · jiezi

关于mongodb:赵强老师在MongoDB中使用MapReduce方式计算聚合

MapReduce 可能计算非常复杂的聚合逻辑,非常灵活,然而,MapReduce十分慢,不应该用于实时的数据分析中。MapReduce可能在多台Server上并行执行,每台Server只负责实现一部分wordload,最初将wordload发送到Master Server上合并,计算出最终的后果集,返回客户端。 MapReduce的根本思维,如下图所示: 在这个例子中,咱们以一个求和为例。首先执行Map阶段,把一个大工作拆分成若干个小工作,每个小工作运行在不同的节点上,从而反对分布式计算,这个阶段叫做Map(如蓝框所示);每个小工作输入的后果再进行二次计算,最初失去后果55,这个阶段叫做Reduce(如红框所示)。 应用MapReduce形式计算聚合,次要分为三步:Map,Shuffle(拼凑)和Reduce,Map和Reduce须要显式定义,shuffle由MongoDB来实现。 Map:将操作映射到每个doc,产生Key和ValueShuffle:依照Key进行分组,并将key雷同的Value组合成数组Reduce:把Value数组化简为单值咱们以上面的测试数据(员工数据)为例,来为大家演示。 db.emp.insert([{_id:7369,ename:'SMITH' ,job:'CLERK' ,mgr:7902,hiredate:'17-12-80',sal:800,comm:0,deptno:20},{_id:7499,ename:'ALLEN' ,job:'SALESMAN' ,mgr:7698,hiredate:'20-02-81',sal:1600,comm:300 ,deptno:30},{_id:7521,ename:'WARD' ,job:'SALESMAN' ,mgr:7698,hiredate:'22-02-81',sal:1250,comm:500 ,deptno:30},{_id:7566,ename:'JONES' ,job:'MANAGER' ,mgr:7839,hiredate:'02-04-81',sal:2975,comm:0,deptno:20},{_id:7654,ename:'MARTIN',job:'SALESMAN' ,mgr:7698,hiredate:'28-09-81',sal:1250,comm:1400,deptno:30},{_id:7698,ename:'BLAKE' ,job:'MANAGER' ,mgr:7839,hiredate:'01-05-81',sal:2850,comm:0,deptno:30},{_id:7782,ename:'CLARK' ,job:'MANAGER' ,mgr:7839,hiredate:'09-06-81',sal:2450,comm:0,deptno:10},{_id:7788,ename:'SCOTT' ,job:'ANALYST' ,mgr:7566,hiredate:'19-04-87',sal:3000,comm:0,deptno:20},{_id:7839,ename:'KING' ,job:'PRESIDENT',mgr:0,hiredate:'17-11-81',sal:5000,comm:0,deptno:10},{_id:7844,ename:'TURNER',job:'SALESMAN' ,mgr:7698,hiredate:'08-09-81',sal:1500,comm:0,deptno:30},{_id:7876,ename:'ADAMS' ,job:'CLERK' ,mgr:7788,hiredate:'23-05-87',sal:1100,comm:0,deptno:20},{_id:7900,ename:'JAMES' ,job:'CLERK' ,mgr:7698,hiredate:'03-12-81',sal:950,comm:0,deptno:30},{_id:7902,ename:'FORD' ,job:'ANALYST' ,mgr:7566,hiredate:'03-12-81',sal:3000,comm:0,deptno:20},{_id:7934,ename:'MILLER',job:'CLERK' ,mgr:7782,hiredate:'23-01-82',sal:1300,comm:0,deptno:10}]);(案例一)求员工表中,每种职位的人数var map1=function(){emit(this.job,1)}var reduce1=function(job,count){return Array.sum(count)}db.emp.mapReduce(map1,reduce1,{out:"mrdemo1"})(案例二)求员工表中,每个部门的工资总和var map2=function(){emit(this.deptno,this.sal)}var reduce2=function(deptno,sal){return Array.sum(sal)}db.emp.mapReduce(map2,reduce2,{out:"mrdemo2"})(案例三)Troubleshoot the Map Function定义本人的emit函数:var emit = function(key, value) {print("emit");print("key: " + key + " value: " + tojson(value));}测试一条数据:emp7839=db.emp.findOne({_id:7839})map2.apply(emp7839)输入以下后果:emitkey: 10 value: 5000测试多条数据:var myCursor=db.emp.find()while (myCursor.hasNext()) { var doc = myCursor.next(); print ("document _id= " + tojson(doc._id)); map2.apply(doc); print();}(案例四)Troubleshoot the Reduce Function一个简略的测试案例var myTestValues = [ 5, 5, 10 ];var reduce1=function(key,values){return Array.sum(values)}reduce1("mykey",myTestValues)测试:Reduce的value蕴含多个值测试数据:薪水、奖金:var myTestObjects = [ { sal: 1000, comm: 5 }, { sal: 2000, comm: 10 }, { sal: 3000, comm: 15 } ];开发reduce办法:var reduce2=function(key,values) { reducedValue = { sal: 0, comm: 0 }; for(var i=0;i<values.length;i++) { reducedValue.sal += values[i].sal; reducedValue.comm += values[i].comm; } return reducedValue;}测试:reduce2("aa",myTestObjects) ...

September 13, 2020 · 1 min · jiezi

关于mongodb:搭建个人Leanote云笔记本阿里云体验实验室-教程

体验实验室简介阿里云开发者实验室,提供收费阿里云资源,丰盛的云计算利用场景, Step by Step 实现云产品的体验 阿里云体验实验室地址:https://developer.aliyun.com/adc/labs/ 教程介绍本教程将介绍如何搭建集体Leanote云笔记本。 场景体验阿里云体验实验室 将提供一台配置了CentOS 7.7的ECS实例(云服务器)。您能够参考本教程的操作基于已有的环境搭建一个Leanote云笔记本。 阿里云 体验场景资源:https://developer.aliyun.com/adc/scenario/b1ac9deecdb143469de985471b440aa7 背景常识Leanote是一款在线的云笔记利用,有如下特点: 反对网页、PC、手机APP客户端和微信版,随时记录,不便分享,反对语音,图片输出。代码高亮,涵盖所有支流语言的代码高亮,得心应手在Leanote里写代码,记常识。Markdown 编辑器,实时同步预览。业余数学公式编辑,像Word和Latex能编辑数学公式。反对创立思维脑图,将散乱的想法以树状信息分层展现。具体历史纪录,每次保留都在后端备份,轻松查找,一键复原。实时同步云端。步骤一:装置MongoDBMongoDB是一个基于分布式文件存储的高性能数据库,介于关系数据库和非关系数据库之间,它反对的数据结构十分涣散是相似于json和bson格局,因而能够存储比较复杂的数据类型。Mongo最大的特点是它反对的查询语言十分弱小,其语法有点相似于面向对象的查询语言,简直能够实现相似关系数据库单表查问的绝大部分性能,而且还反对对数据建设索引。 Leanote云笔记应用MongoDB作为后端数据库,依照以下步骤依照MongoDB数据库。 1.执行以下命令,装置MongoDB。 yum -y install mongodb mongodb-server.x86_64 mariadb-devel.i6862.执行以下命令,启动MongoDB服务。 systemctl start mongod3.执行以下命令,查看MongoDB运行状态。如果active的状态为active(running),示意MongoDB服务正在运行。 systemctl status mongod 步骤四:装置Leanote1.下载Leanote二进制安装包。 wget https://nchc.dl.sourceforge.net/project/leanote-bin/2.6.1/leanote-linux-amd64-v2.6.1.bin.tar.gz2.解压安装包。 tar -zxvf leanote-linux-amd64-v2.6.1.bin.tar.gz3.编辑文件leanote/conf/app.conf,在文件中找到app.secret项,将该项的值改为任意字符串(如不批改将会有平安危险)。 阐明:依据Leanote官网文档,如不批改app.secret项的值,将会有安全隐患。a.应用vim编辑器关上文件leanote/conf/app.conf。 vim leanote/conf/app.confb.进入vim编辑器后,输出:/app.secret=并按下回车查找app.secret地位。 c.找到该项地位后按下i键进入编辑模式,批改该项的值为任意字符串。 d.批改实现后,按下esc键退出编辑模式,输出:wq保留并退出vim编辑器。 批改后如图所示。 4.初始化数据库。 mongorestore -h localhost -d leanote --dir /root/leanote/mongodb_backup/leanote_install_data/5.启动服务。 nohup bash /root/leanote/bin/run.sh > /root/leanote/run.log 2>&1 &6.拜访云笔记。 在浏览器中拜访http://&lt;ECS公网IP地址>:9000,请将<ECS公网IP地址>替换为左侧资源栏中的ECS公网IP地址。默认治理用户为admin,明码为abc123。登录胜利后如下图所示。 阿里云体验实验室地址:https://developer.aliyun.com/adc/labs/

September 4, 2020 · 1 min · jiezi

关于mongodb:通过mongodb-TTL机制让集合中的数据自动过期删除

MongoDB的汇合有衣蛾 TTL (即 time to live,即生存的工夫) 的个性。TTL能够让mongodb主动移除过期了的数据,(咦,这岂不是正好合乎日志类的数据诉求)。这种机制便比拟适宜一些 日志数据 机器产生的事件数据 甚至能够用来做 session会话 。 MongoDB 通过一个 TTL 索引来实现这种所谓的 TTL 汇合。该个性的实现机制是: mongod 通过一个后盾线程去一直的读取汇合中某个日期类型的索引,并且移除掉满足过期条件的文档documents。 上面咱们来看如何实操: 创立 TTL 索引咱们是通过 db.collection.createIndex() 命令配合 expireAfterSeconds 选项来对汇合中某个字段做TTL索引。这个字段必须是 date 类型或者是一个蕴含 date 类型值的数组字段。 创立 TTL 过期规定的话,有 2 种模式: 一种是相似于前端的maxAge模式,即设置一个时长,当mongodb发现以后工夫与工夫索引字段的时差超过了maxAge,则认为过期另一种是相似前端的 expireTime 模式。即设置一个过期工夫点,当mongodb发现以后零碎工夫曾经超过那个工夫点,则认为记录过期上面咱们别离看下两种模式的设置形式。 在一个特定的时长之后删除文档如果咱们 db 中有一个 logs 的汇合,其中的记录格局为: { "_id": "5f43d5c00b34962beb026aad", "createdAt": Date(), "requestTime": 1598281152423, "reportId": "1598281152423-6245975993217447",}接下来,咱们针对 createdAt 这个字段建设一个 TTL 索引: db.logs.createIndex({ "createdAt": 1 }, {expireAfterSeconds: 3600 })其中 createdAt: 1 示意对 createdAt 字段建设正序的索引。选项 expireAfterSeconds 示意 3600秒(即1小时) 之后过期。其含意是,在createdAt字段的值的时刻根底上,再加上 3600秒 之后的那个工夫过期。 ...

September 2, 2020 · 1 min · jiezi

关于mongodb:Mongodb安装win10

Mongodb下载下载安装包不要勾选!!!Install MongoDB Compass切记不要勾选!! 下载实现后须要配置mongodb文件的data文件和log文件 在bin的统计目录下创立data文件data文件中蕴含db文件和log文件log文件中蕴含mongodb.logE:\tools\mongodb\data\dbE:\tools\mongodb\data\log‪E:\tools\mongodb\data\log\mongodb.log基本上就是这样的构造 实现后在bin的同级目录下创立文件mongo.config 外面填写 ##数据文件 此处=后对应到数据所寄存的目录dbpath=E:\tools\mongodb\data\db##日志文件 此处=后对应到日志文件所在门路logpath=E:\tools\mongodb\data\log\mongodb.log##谬误日志采纳追加模式,配置这个选项后mongodb的日志会追加到现有的日志文件,而不是从新创建一个新文件logappend=true #启用日志文件,默认启用journal=true #这个选项能够过滤掉一些无用的日志信息,若须要调试应用请设置为falsequiet=true #端口号 默认为27017port=27017实现后保留退出以管理员身份关上cmd窗口切换到mongodb的bin目录下输出命令`mongod --logpath "‪E:toolsmongodbdatalogmongodb.log" --logappend --dbpath "E:toolsmongodbdatadb" --serviceName "MongoDB" --install` 实现后在点击此电脑右键治理,服务和应用程序,服务。能够看到MongoDB服务点击启动就能够了 在关上cmd窗口输出命令mongo 这样就能够应用了。

August 19, 2020 · 1 min · jiezi

关于mongodb:mongodb-mongo常用字段类型

1、json和bsonJSON JSON是一种简略的数据表示形式,它易于了解、易于解析、易于记忆。但从另一方面来说,因为只有null、布尔、数字、字符串、数组和对象这几种数据类型,所以JSON有肯定局限性。例如,JSON没有日期类型,JSON只有一种数字类型,无奈辨别浮点数和整数,更别说辨别32为和64位数字了。再者,JSON无奈示意其余一些通用类型,如正则表达式或函数。 BSON BSON(Binary Serialized Document Format)是一品种JSON的二进制模式的存储格局,简称Binary JSON。它和JSON一样,反对内嵌的文档对象和数组对象,然而BSON有JSON没有的一些数据类型,如Date和BinData类型。它反对上面数据类型。每个数据类型对应一个数字,在MongoDB中能够应用$type操作符查看相应的文档的BSON类型 MongoDB毋庸申明数据类型,全自动匹配 每种BSON类型都具备整数和字符串标识符,如下表所示: TypeNumberAliasNotesDouble1“double” String2“string” Object3“object” Array4“array” Binary data5“binData” Undefined6“undefined”Deprecated.ObjectId7“objectId” Boolean8“bool” Date9“date” Null10“null” Regular Expression11“regex” DBPointer12“dbPointer”Deprecated.JavaScript13“javascript” Symbol14“symbol”Deprecated.JavaScript (with scope)15“javascriptWithScope”Deprecated in MongoDB 4.4.32-bit integer16“int” Timestamp17“timestamp” 64-bit integer18“long” Decimal12819“decimal”New in version 3.4.Min key-1“minKey” Max key127“maxKey” 2、数据类型2.1、double类型mongo shell 客户端默认将数字看成浮点数。 2.2、 64-bit integer(long)BSON有两种整型数据类型:32位有符号整型数据(INT); 64位有符号型整型数据(LONG) 转换函数为 NumberLong(), 2.3、 32-bit integer (int)32-bit integer (int)和64-bit integer(long)差不多,不同的是,其转换函数由NumberLong()变成了 NumberInt() ,其承受的参数,也当成string类型来解决。 2.4、decimalDecimal 这个数据类型是在Mongo 3.4 才开始引入的。新增Decimal数值类型次要是为了记录、解决货币数据 ,例如 财经数据、税率数据等。有时候,一些科学计算也采纳Decimal类型。 因为mongo shell默认将数字当成double类型,所以也是须要显式的转换函数NumberDecimal(),其承受参数是string值。 ...

August 5, 2020 · 2 min · jiezi

关于mongodb:MongoDB-Charts-安装和使用

MongoDB Charts 装置和应用最近发现了个有意思的货色,MongoDB Charts ,它是MongoDB官网提供的 用于图表展现MongoDB数据的效果图: 1.什么是MongoDB ChartsMongoDB Charts最弱小的性能之一是其内置的 聚合性能。聚合容许您通过各种指标解决收集数据,并执行平均值和标准差等计算,以进一步理解您的数据。 并且它提供了Embed Chart 性能 不便嵌入到你本人Web程序中 2.装置和运行MongoDB Charts装置过程步骤挺多的,然而对着官网教程一步步来 还是很简略的官网MongoDB Charts 装置文档 2.1 筹备环境Mac/Linux 零碎Docker version 18.09.1MongoDB shell version v4.2.0因为MongoDB Charts须要应用Docker装置,所以须要有Dokcer环境 2.2 创立一个目录存储图表配置mkdir mongodb-chartscd mongodb-charts2.3 下载MongoDB Charts Docker Compose filehttps://www.mongodb.com/downl...Dokcer Compose file 附上我下载的文件 version: '3.3'services: charts: image: quay.io/mongodb/charts:19.12.1 hostname: charts ports: # host:container port mapping. If you want MongoDB Charts to be # reachable on a different port on the docker host, change this # to <port>:80, e.g. 8888:80. - 80:80 - 443:443 volumes: - keys:/mongodb-charts/volumes/keys - logs:/mongodb-charts/volumes/logs - db-certs:/mongodb-charts/volumes/db-certs - web-certs:/mongodb-charts/volumes/web-certs environment: # The presence of following 2 environment variables will enable HTTPS on Charts server. # All HTTP requests will be redirected to HTTPS as well. # To enable HTTPS, upload your certificate and key file to the web-certs volume, # uncomment the following lines and replace with the names of your certificate and key file. # CHARTS_HTTPS_CERTIFICATE_FILE: charts-https.crt # CHARTS_HTTPS_CERTIFICATE_KEY_FILE: charts-https.key # This environment variable controls the built-in support widget and # metrics collection in MongoDB Charts. To disable both, set the value # to "off". The default is "on". CHARTS_SUPPORT_WIDGET_AND_METRICS: 'on' # Directory where you can upload SSL certificates (.pem format) which # should be considered trusted self-signed or root certificates when # Charts is accessing MongoDB servers with ?ssl=true SSL_CERT_DIR: /mongodb-charts/volumes/db-certs networks: - backend secrets: - charts-mongodb-urinetworks: backend:volumes: keys: logs: db-certs: web-certs:secrets: charts-mongodb-uri: external: true2.4 Enable Docker Swarm modedocker swarm init2.5 拉取MongoDB Charts image 镜像对应你下载的 Docker Compose file 版本 ...

August 5, 2020 · 3 min · jiezi

关于mongodb:常用高并发网络线程模型设计及MongoDB线程模型优化实践

服务端通常须要反对高并发业务拜访,如何设计优良的服务端网络IO工作线程/过程模型对业务的高并发拜访需要起着至关重要的核心作用。 本文总结了了不同场景下的多种网络IO线程/过程模型,并给出了各种模型的优缺点及其性能优化办法,非常适合服务端开发、中间件开发、数据库开发等开发人员借鉴。 (顺便提一下,OPPO互联网文档数据库团队急缺mongodb内核及存储引擎研发人才,欢送退出oppo参加千万级峰值tps/万亿级数据量数据库研发。联系人:yangyazhou#oppo.com) 1. 线程模型一. 单线程网络IO复用模型 阐明: 所有网络IO事件(accept事件、读事件、写事件)注册到epoll事件集主循环中通过epoll_wait一次性获取内核态收集到的epoll事件信息,而后轮询执行各个事件对应的回调。事件注册、epoll_wait事件获取、事件回调执行全副由一个线程解决1.1一个残缺申请组成一个残缺的申请处理过程次要蕴含以下几个局部: 步骤1:通过epoll_wait一次性获取网络IO事件 步骤2:读取数据及协定解析 步骤3:解析胜利后进行业务逻辑解决,而后应答客户端 1.2 该网络线程模型缺点所有工作都由一个线程执行,包含epoll事件获取、事件处理(数据读写)、只有任一一个申请的事件回调解决阻塞,其余申请都会阻塞。例如redis的hash构造,如果filed过多,假如一个hash key蕴含数百万filed,则该Hash key过期的时候,整个redis阻塞。单线程工作模型,CPU会成为瓶颈,如果QPS过高,整个CPU负载会达到100%,时延抖动厉害。1.3 典型案例redis缓存推特缓存中间件twemproxy1.4 主循环工作流程while (1) { //epoll_wait期待网络事件,如果有网络事件则返回,或者超时范畴 size_t numevents= epoll_wait(); //遍历后面epoll获取到的网络事件,执行对应事件回调 for (j = 0; j < numevents; j++) { if(读事件) { //读数据 readData()//解析parseData() //读事件处理、读到数据后的业务逻辑解决 requestDeal() } else if(写事件) { //写事件处理,写数据逻辑解决 writeEentDeal() } else {//异样事件处理errorDeal() } }}阐明:后续多线程/过程模型中,每个线程/过程的主流程和该while()流程统一。 1.5 redis源码剖析及异步网络IO复用精简版demo因为之前工作须要,须要对redis内核做二次优化开发,因而对整个redis代码做了局部代码正文,同时把redis的网络模块独立进去做成了简略demo,该demo对了解epoll网络事件处理及Io复用实现会有帮忙,代码比拟简短,能够参考如下我的项目: redis源码具体正文剖析 redis网络模块精简版demo 推特缓存中间件twemproxy源码剖析实现 2. 线程模型二. 单listener+固定worker线程该线程模型图如下图所示: 阐明: listener线程负责承受所有的客户端链接listener线程每接管到一个新的客户端链接产生一个新的fd,而后通过散发器发送给对应的工作线程(hash形式)工作线程获取到对应的新链接fd后,后续该链接上的所有网络IO读写都由该线程解决假如有32个链接,则32个链接建设胜利后,每个线程均匀解决4个链接上的读写、报文解决、业务逻辑解决2.1 该网络线程模型缺点进行accept解决的listener线程只有一个,在霎时高并发场景容易成为瓶颈一个线程通过IO复用形式解决多个链接fd的数据读写、报文解析及后续业务逻辑解决,这个过程会有重大的排队景象,例如某个链接的报文接管解析结束后的外部解决工夫过长,则其余链接的申请就会阻塞排队2.2 典型案例memcache缓存,实用于外部解决比拟快的缓存场景、代理两头场景。memcache源码实现中文剖析能够详见: memcache源码实现剖析 3. 线程模型三. 固定worker线程模型(reuseport)该模型原型图如下: ...

August 4, 2020 · 1 min · jiezi

关于mongodb:华为云技术分享DLI跨源|当DLI遇见MongoDB

导语:MongoDB作为灵便高效易扩大的no-schema数据库,越来越受到互联网公司、游戏行业等开发者的青眼,然而MongoDB有着独特的语言接口,并不能很好满足数据分析师构建数据治理利用的需要,而数据湖摸索DLI恰好解决了这一痛点。搭配华为云上DDS服务提供的MongoDB,DLI无需数据搬迁,便能够间接应用SQL剖析,并且将剖析后的数据导入OBS,RDS,DWS等更多的云上数据存储。当DLI遇见MongoDB,让数据不再成为“孤岛”。 一、X游戏公司的数据分析场景X游戏公司最近新上了一款爆款手游A,日活冲破百万,每月都能为X公司奉献数千万的利润。随着游戏业务量的迅猛发展,游戏数据分析师小鑫遇到了前所未有的挑战。 过后为了游戏疾速上线,架构师选用华为云DDS服务提供的MongoDB数据库,用于用户数据存储。MongoDB高性能,易扩大,no-schema等个性,很好的撑持了游戏爆发式数据增长以及游戏玩法的疾速更新迭代。然而,当初存储在MongoDB里的海量数据,犹如暗藏在群山中的矿脉,如何能力开掘其中更大价值?如何筛选出优质客户从而提供更好地服务?如何剖析用户行为,为游戏开发提供切实可行的数据反对?。。。种种数据分析需要,让小鑫抓狂了,他急需一种易用高效的剖析工具,帮助他实现数据挖掘工作。 二、MongoDB的数据存储 在解决小鑫的问题之前,让咱们来理解一下MongoDB。它是面向文档的数据库,介于关系型数据库和非关系型数据库之间,具备十分弱小的扩大能力。其数据库里的一条记录就是一个文档,它由域和值对组成。MongoDB的文档是一个键值(key-value)对,相似于一个json对象。但MongoDB 的文档不须要设置雷同的字段,并且雷同的字段不须要雷同的数据类型,这也是MongoDB的突出特点。 MongoDB的劣势在于,其一:性能强。MongoDB领有弱小数据长久能力,缩小对数据库系统的输出/输入操作;通过构建索引,反对更快的查问速度,并能够反对从嵌入式文档和数组中返回键值。其二:反对丰盛的查询语言。MongoDB具备良好的开放性和兼容性,反对多种语言进行读写操作、文档搜寻、数据聚合等操作,当然这些API是MongoDB特有的,存在肯定学习老本。其三:便捷的复制能力。MongoDB提供一种叫正本集(replica set)的服务,将数据分布在多台机器上以实现数据冗余和主动故障转移。其四:扩展性强。MongoDB的外围性能之一就是良好的扩大能力。通过分片的形式将数据分布在一组计算机中,让每一个服务器外面存储的数据都是一样大小。 三、DLI锋芒毕露小鑫找到了华为工程师Z,小Z向小鑫极力推荐华为云数据湖剖析利器DLI,只有你会SQL,就能玩转云上各种数据源,包含了DDS。DLI提供跨源交融剖析性能,兼容SQL,SPARK,FLINK编程API,只需轻松几步,便可剖析DDS中的MongoDB数据,无需数据搬迁。“这么神奇?”小鑫蠢蠢欲动。小Z立即祭出了,DLI剖析MongoDB三版斧: 1. 建设跨源连贯DLI剖析集群和用户的DDS集群分属不同的虚构子网,存在网络隔离,而建设跨源连贯,即可买通DLI集群与DDS集群的网络。具体步骤是 先查看DDS集群网络信息,记录下集群所属VPC、子网、子网网段 在DLI跨源连贯治理界面,创立指向DDS的增强型跨源连贯,在连贯中指定DDS所属的VPC和子网 最初在新建的跨源连贯中绑定用户队列,增强型跨源连贯绑定的队列须要是非按需队列 2. 创立跨源表小鑫的样例数据包含了一个用户汇合,一个配备汇合。用户汇合中寄存着用户信息,配备汇合中寄存着用户游戏配备信息。 在DLI SQL编辑器中,执行创立MongoDB跨源表的SQL,创立关联的用户表和配备表,如下所示 CREATE TABLE user( account string, phone string, age int, sex string, credit int, lastlogin int) USING MONGO OPTIONS ( 'url' = '192.168.0.95:8635,192.168.0.98:8635/test?authSource=admin', 'database' = 'test', 'collection' = 'user', 'user' = 'rwuser', 'password' = '***'); CREATE TABLE equipment( account string, eq_id int, attack int, defence int, weight int, name string, value int) USING MONGO OPTIONS ( 'url' = '192.168.0.95:8635,192.168.0.98:8635/test?authSource=admin', 'database' = 'test', 'collection' = 'equipment', 'user' = 'rwuser', 'password' = '***'); ...

July 31, 2020 · 1 min · jiezi

关于mongodb:MongoDB高手课学习记录第二十四天

写在后面第四章的内容就目前来看,有点悲观。理论的货色不多,太实践,有点糊弄。说难据说太水了。特地像明天要学的内容,本认为有很多干货,后果讲本人的产品说了半天,测试版还得连线应用。就像极客工夫上的《Vue开发实战》课程,花了大量的工夫去讲 Ant Design,还没讲透。好了,不吐槽了,换个角度看,也阐明攒一门的不容易。开始明天的学习吧。 第二十四天明天要学习的是《44 | 关系型数据库迁徙》、《45 | 数据库迁徙形式及工具》、《46 | Oracle迁徙实战》 从关系数据库迁徙到MongoDB的理由对于高并发的需要(数千-数十万OPS),关系型数据库不容易扩大(绝对的)疾速迭代,关系型模式太谨严(所以说模式设计很重要,预戴皇冠,必承其重)灵便的JSON模式大数据量需要地理位置查问多数据中跨地区部署(关系数据库不是不行,太光钱了)利用迁徙难度关系型数据库之间迁徙绝对简略但关系型到文档型,则绝对简单须要思考; 总体架构(比方单机式改成分布式)模式设计(从关系模型改成文档模型)SQL语句/存储过程/JDBC/ORM等数据迁徙(如何解决已有数据)总体架构这是说的三倍资源,是因为MongoDB举荐起码要部署3个结点。 模式设计这个才是重中之重,原本想先学习这章的目标也是这个 迁徙的主战场 数据迁徙接下来的重点也是放在了数据如何迁徙上,当然是借助工具的 数据库导出导入这块是以MySQL为例,先将表导出成csv文件,而后用mongoimport将csv的表数据,间接转成文档。实用于间接换库的场景 批量同步次要就是借助于ETL工具了,既然是批量解决,当然对系统的性能影响就比拟大了,实用于定期结转。比方将历史交易记录转到查问机,用于业务剖析等 实时同步当然还是借助于工具比方GoldenGate,只是因为是小批量时时结转,所以对系统的影响小,但如果出了问题就另说了 利用主导迁徙就是在团队帮助,在不影响业务的同时,一步一步将利用从关系数据库迁徙到文档数据库,当然投入就大了,周期也长,但最保险 数据迁徙形式总结 迁徙实战这就不说太了,就是介绍了一下tapdata的应用 附录Golden GateTalendPentaho(Kettle)Informatica

July 30, 2020 · 1 min · jiezi

关于mongodb:MongoDB高手课学习记录第二十四天

写在后面第四章的内容就目前来看,有点悲观。理论的货色不多,太实践,有点糊弄。说难据说太水了。特地像明天要学的内容,本认为有很多干货,后果讲本人的产品说了半天,测试版还得连线应用。就像极客工夫上的《Vue开发实战》课程,花了大量的工夫去讲 Ant Design,还没讲透。好了,不吐槽了,换个角度看,也阐明攒一门的不容易。开始明天的学习吧。 第二十四天明天要学习的是《44 | 关系型数据库迁徙》、《45 | 数据库迁徙形式及工具》、《46 | Oracle迁徙实战》 从关系数据库迁徙到MongoDB的理由对于高并发的需要(数千-数十万OPS),关系型数据库不容易扩大(绝对的)疾速迭代,关系型模式太谨严(所以说模式设计很重要,预戴皇冠,必承其重)灵便的JSON模式大数据量需要地理位置查问多数据中跨地区部署(关系数据库不是不行,太光钱了)利用迁徙难度关系型数据库之间迁徙绝对简略但关系型到文档型,则绝对简单须要思考; 总体架构(比方单机式改成分布式)模式设计(从关系模型改成文档模型)SQL语句/存储过程/JDBC/ORM等数据迁徙(如何解决已有数据)总体架构这是说的三倍资源,是因为MongoDB举荐起码要部署3个结点。 模式设计这个才是重中之重,原本想先学习这章的目标也是这个 迁徙的主战场 数据迁徙接下来的重点也是放在了数据如何迁徙上,当然是借助工具的 数据库导出导入这块是以MySQL为例,先将表导出成csv文件,而后用mongoimport将csv的表数据,间接转成文档。实用于间接换库的场景 批量同步次要就是借助于ETL工具了,既然是批量解决,当然对系统的性能影响就比拟大了,实用于定期结转。比方将历史交易记录转到查问机,用于业务剖析等 实时同步当然还是借助于工具比方GoldenGate,只是因为是小批量时时结转,所以对系统的影响小,但如果出了问题就另说了 利用主导迁徙就是在团队帮助,在不影响业务的同时,一步一步将利用从关系数据库迁徙到文档数据库,当然投入就大了,周期也长,但最保险 数据迁徙形式总结 迁徙实战这就不说太了,就是介绍了一下tapdata的应用 附录Golden GateTalendPentaho(Kettle)Informatica

July 30, 2020 · 1 min · jiezi

关于mongodb:mongodb-安装及安全问题

故事会前几天在线上环境用docker装置mongodb(3.4)来做测试,辛辛苦苦的增加了数据,而后明天发现被黑了库都给我删完了..哭mongodb 自身的安全隐患默认不须要账号密码就能连贯操作,批改增加删除都能够mongodb 3.6 之前默认是0.0.0.0 连贯,所以很容易就能通过公网连贯到mongodb(3.6 之后为127.0.0.1 只能通过本机连贯)解决方案设置authorization鉴权,增加用户账号密码应用mongodb3.6之后版本 (限度只能本机连贯是平安的,但这样应用场景会很窄,因为我的其它利用都是应用docker容器部署的,只能localhost的话就连不上数据库了, 所以咱们能够通过批改连贯地址为 以后主机的内网ip来连贯)屏蔽主机向外裸露mongodb的默认端口27017装置因为国内daocloud 的mongo镜像版本没有3.6及以上的,而docker hub的连贯速度齐全劝退,思来想去还是在主机上间接装置一个mongodb 环境是 ubuntu 18.04官网装置文档 增加 GPG key wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -增加 list file echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list更新数据包 sudo apt-get update装置 sudo apt-get install -y mongodb-orgmongodb 启动 重启 进行 等命令# 启动sudo systemctl start mongod# 查看状态sudo systemctl status mongod# 进行sudo systemctl stop mongod# 重启sudo systemctl restart mongod# 开机启动sudo systemctl enable mongod卸载 mongodb ...

July 29, 2020 · 1 min · jiezi

关于mongodb:MongoDB的基本使用

第一节 装置装置遇见问题 第一步官网下载:https://www.mongodb.com/try/d... 第二步:运行 => 输出mongo => 再输出 show dbs 第二节 简略构造 输出阐明use mxlogo如果不存在就创立,存在就读取以后数据db.user.insert({"username":"zhanghui", "age":20})创立username和ageshow dbs以后所有创立过的库show collections查看有哪些.如user.admindb.user.find()看看user外面有多个条数据db.dropDatabase()删除以后的mxlogo的这个库db.user.intersert({"name":"sbzk", "age":250})user里创立这两个db.user.drop()只删除mxlogo里的userdb.user.find({'age':14})寻找age是14的人db.user.find({'age':{$gt:22}})年龄‘大于’22db.user.find({'age':{$lt:28}})年龄‘小于’28db.user.find({'age':{$gte:22}})年龄‘大于等于’22db.user.find({'age':{$lte:28}})年龄‘小于等于’28db.user.find({'age':{$gt:22, $lte:28}})年龄‘大于等于’28并且小于等于28db.user.find({'name':/a/})含糊查找,比方la, an, caodb.user.find({'name':/^a$/})结尾用^来搜寻,结尾搜寻用$db.user.find().sort({'age':1})升序从上往下123456db.user.find().sort({'age':-1})升序从下往上654321

July 26, 2020 · 1 min · jiezi

关于mongodb:MongoDB的安装问题

我的应用零碎版本是8.1,有些人看到这一幕有些诧异。因为7有些老,10我的电脑总死机卡顿。所以始终都在用8.1 废话不多说,我装置了MongoDB的4.x提醒报错。百度搜寻说是短少依赖包,下载微软的依赖包仍旧鸟不拉屎 起初问了IT营的新手解决了。首先你要抉择3.x版本 装置后须要增加环境变量,屁股前面加你装置后的MongoDB。他悄悄的在你的c盘放了一个MongoDB,就在Program Files里 我的电脑 =>属性=>环境变量=>path %SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;%SYSTEMROOT%System32WindowsPowerShellv1.0;C:Program Filesnodejs\;C:Program FilesMongoDBServer4.0bin 然而此时并没有实现cmd输出 mongo 还是错的,如果胜利会有很多行 起因!咱们还没有启动,启动办法就是mongod --dbpath E:\MongoDB\server\4.0\data这个是我本人当初装置他自定义装置门路 我放到了E盘找到data这个胜利了 此时咱们只须要再建一个cmd输出mongo会显示一大堆show dbs 会显示几样货色,不会报错了

July 23, 2020 · 1 min · jiezi

关于mongodb:MongoDB-事务复制和分片的关系

摘要:本文尝试对Mongo的复制和分布式事务的原理进行形容,在必要的中央,对实现的正确性进行论证,心愿能为MongoDB内核爱好者提供一些参考。1.前言MongoDB基于wiredTiger提供的泛化SI的性能,重构了readHistory(readMajority)的能力基于wiredTiger提供的AllCommittedTimestamp API,重构了前缀统一的主从复制(Prefix-Consistent-Replication)引入混合逻辑时钟(HLC),每个节点(Mongos/Mongod)的逻辑时钟维持在靠近的值,基于此实现ChangeStream, 联合HLC与CLOCK-SI,实现分布式事务,HLC和泛化SI,CLOCK-SI两篇Paper能够作为了解MongoDB的设计的实践参考(这里并没有说MongoDB是Paper的实现)。本文尝试对Mongo的复制和分布式事务的原理进行形容,在必要的中央,对实现的正确性进行论证,心愿能为MongoDB内核爱好者提供一些参考。 2.MongoDB正本集事务介绍MongoDB 正本集的事务MongoDB正本集的复制是基于raft协定,相比于Paxos,raft协定实现简略,然而raft协定只反对single-master,对应的,MongoDB的正本集是主从架构,而且只有主节点反对写入操作。MongoDB正本集的事务管理,包含冲突检测,事务提交等要害操作,都只在主节点上实现。也就是说正本集的事务在事务管理方面,跟单节点逻辑基本一致。MongoDB的事务,依然是实现了 ACID 四个个性, MongoDB应用 SI 作为事务的隔离级别。3.SI的简介SI,即SnapshotIsolation,中文称为快照隔离,是一种mvcc的实现机制,它在1995年的A Critique of ANSI SQL Isolation Levels中被正式提出。因快照工夫点的选取上的不同,又分为Conventional Si 和 Generalized SI。CSI(Convensional SI)CSI 选取以后最新的零碎快照作为事务的读取快照就是在事务开始的时候,取得以后db最新的snapshot,作为事务的读取的snapshot,snapshot(Ti) = start(Ti)能够缩小写事务抵触产生的概率,并且提供读事务读取最新数据的能力个别咱们说一个数据库反对SI隔离级别,其实默认是说反对CSI。比方RocksDB反对的SI就是CSI,WiredTiger在3.0版本之前反对的SI也是CSI。GSI(Generalized SI)GSI抉择历史上的数据库快照作为事务的读取快照,因而CSI能够看作GSI的一个特例。在复制集的状况下,思考 CSI, 对于主节点上的事务,每次事务的开始工夫选取的零碎 最新的 快照, 然而对于其余从节点来说, 并没有 对立的 “最新的” 快照这个概念。泛化的快照实际上是基于快照观测失去的,对于以后事务来说,咱们通过选取适合的 更早工夫的快照,能够让 从节点上的事务正确且无提早的执行。举例如下:例如以后数据库的状态是, S={T1, T2, T3}, 当初要开始执行T4,如果咱们晓得T4要批改的值,在T3上没有被批改, 那么咱们在执行T4的时候, 就能够依照 T2 commit后的snashot进行读取。如何抉择更早的工夫点,须要满足上面的规定, 符号定义Ti: 事务iXi: 被事务i批改过的X变量snapshot(Ti): 事务i的选取的快照工夫start(Ti): 事务i的开始工夫commit(Ti): 事务i的提交工夫abort(Ti): the time when Ti is aborted.end(Ti): the time when Ti is committed or aborted.公式解释读规定G1.1, 如果变量X被本事务批改了值且读取到了新的值, 那么 读操作肯定在写操作前面;G1.2, 如果事务i读取了事务j更新的变量的X, 那么肯定不会有事务i更新X的操作,在事务i读取了事务j更新的变量的X这个操作后面;G1.3, 事务j的提交工夫早于事务i的快照工夫;G1.4, 对于任意一个会更新变量X的事务k, 那么这个事务k肯定满足, 要么事务k的提交工夫小于事务j, 要么这个事务k的提交工夫大于事务i。写规定 ...

July 22, 2020 · 2 min · jiezi

关于mongodb:明了-MongoDB-外键的基本使用

小小持续进行学习,这次学习的内容是MongoDB外键的根本应用。 示意表关系的办法在传统的关系型数据库当中,示意表关系,数据是通过索引来欠缺。而在MongoDB中,示意表关系,应用的是嵌套,即,一个文档嵌套一个文档的办法,作为MongoDB的两个文档的关联,以及应用,reference link作为文档和文档之间的关联。 文档嵌套应用可视化的这里应用可视化的编辑器作为文档嵌套输出以下的文档对象 { "ming": "ming", "ming2": { "ming3": "ming8" }} 插入胜利当前如下 这样就实现了文档的嵌套,即,示意两个文档之间的关联。 应用JDK这里应用JDK进行连贯。首先增加依赖 <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.5.0</version></dependency>进行连贯 try{ // 连贯到 mongodb 服务 MongoClient mongoClient = new MongoClient( "106.53.115.12" , 27017 ); // 连贯到数据库 MongoDatabase mongoDatabase = mongoClient.getDatabase("koa"); System.out.println("Connect to database successfully"); }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); }进行插入List<Document> collections = new ArrayList<Document>();Document d1 = new Document();d1.append("name", "三国演义").append("author", "罗贯中");Document d2 = new Document();d2.append("name", "红楼梦").append("author", d1);collections.add(d2);c.insertMany(collections);查问进去的数据如下 ...

July 22, 2020 · 1 min · jiezi

关于mongodb:MongoDB高手课学习记录第二十三天

写在后面第二十三天明天要学习的是《42 | MongoDB典型案例(一)》与《43 | MongoDB典型案例(二)》章节。这二章次要是就 MongoDB 的应有场景接合大公司的利用进行了解说。集体感觉有些有点案例就那么回事,有点牵强。 案例保险公司将70多套零碎中的客户保单数据整合在一起 传统银行历史交易查问,反对动静扩容 互联网公司日志,地理位置等小数量但大交易的数据 云厂商异构数据 网络设备生产商电商平台 游览服务商聚合计算 数据治理厂商进步性能 总结明天讲的都是些大厂利用的案例,但只看实践还没方法感同深受,要想用得好,还得看模型的设计。

July 21, 2020 · 1 min · jiezi

关于mongodb:MongoDB-Cloud来了

MongoDB日前公布了新的云品牌——MongoDB Cloud,该品牌旗下除了MongoDB云版本Atlas之外还包含Atlas Data Lake和挪动端数据库Realm。 每年6月是MongoDB举办技术大会的日子,这是MongoDB一年一度最大的流动,MongoDB重大技术的公布和将来产品路线也会在这次大会上公布,因而,是察看MongoDB将来倒退的最好机会。往年因为新冠肺炎疫情的起因,会议改成了线上,大会名称变成了MongoDB.Live 2020,然而大会承载的使命没变。 MongoDB.Live 2020会上不仅公布了新的品牌——MongoDB Cloud,还有泛滥重要公布,包含Atlas泛滥新的性能(Atlas Search、Atlas Data Lake、Atlas Online Archive)、MongoDB Realm、MongoDB Charts、MongoDB Shell等,会上MongoDB的最新版本的MongoDB 4.4(beta版)也正式亮相。 开释数据潜能MongoDB是数据库行业的后起之秀,但成长十分迅速,曾经继续多年与Oracle、MySQL、SQL Server、PostgreSQL一起位列寰球五大最风行的数据库,其影响力曾经超过传统数据库DB2。 在大会上,MongoDB 总裁兼首席执行官 Dev Ittycheria走漏了MongoDB公司的一些成长数据。截至目前,MongoDB 社区版已下载超过 1 亿次,在寰球 100 多个国家及地区中领有超过 1.8万家各种规模的企业客户。依据Stack Overflow 在寰球范畴内进行的开发人员考察表明,间断 4 年MongoDB 被开发人员评为寰球范畴内最受开发人员青眼的数据库。 “MongoDB 以开释数据潜能为使命,咱们致力于解决开发人员的数据问题。” Dev Ittycheria在演讲时示意。 ![] Dev Ittycheria MongoDB总裁兼首席执行官 确实,因为 MongoDB 独特的文档模型和查询语言使数据处理变得如此容易,很快领有了一个酷爱 MongoDB 的宏大开发人员社区。过后传统数据库曾经十分不适用于新型应用程序,因为这些程序经常须要解决来自不同起源的多种格局的大量数据,还要适应竞争日益强烈的市场。而传统的关系型数据库不灵便、无奈程度扩大,从而使其开发迟缓且保护老本昂扬。 MongoDB首席产品官Sahir Azam说,作为一种新的开源通用数据库,MongoDB有三大核心技术劣势: 首先,是其文档模型。文档模型使数据处理变得容易,因为它具备灵活性,实用于宽泛的用例,并很好地映射了开发人员在古代的、面向对象的编程语言中的工作形式。 第二,分布式系统。程度扩大、冗余和工作负载隔离是古代数据库的根本要求,因而分布式架构十分必要的。 第三,能够在任何中央运行。基于MongoDB能够开始在笔记本电脑上进行开发,在公司数据中心中运行它,或者在公共云中对其进行治理。 “当然,传统数据库的确提供了对要害工作应用程序至关重要的性能,但咱们曾经将诸如传统数据库的这些要害性能,如事务、二级索引、聚合性能以及安全性和治理性能等整合到 MongoDB。” Sahir Azam说,这些性能的组合使得 MongoDB 具备以任何规模反对任何应用程序的弱小实力。这就是MongoDB 当初背地寰球数百万开发人员和成千上万企业青眼的起因。 从Altas到MongoDB Cloud云数据库曾经大势所趋。Gartner此前公布的钻研报告《The Future of the Database Management System (DBMS) Market Is Cloud》认为,数据库翻新的主战场曾经从传统的本地市场转到了云上,数据库云服务是大趋势,将数据库装置在企业数据中心的服务器上曾经或者很快将成为一种“过期”的办法。 ...

July 18, 2020 · 1 min · jiezi

旧版Chrome浏览器的安装和使用chrome63

尽管新版的Chrome浏览器很好用,然而界面风格我还是喜爱旧版的浏览器。我的电脑上有新版和旧版两个。不过失常状况下谷歌浏览器只能装置一个。我的做法是新版的浏览器失常装置,旧版的有点相似eclipse,解压就能够应用。不过应用后面须要解决一个问题。一、下载和装置1、我这里提供一个chrome-win32-63版本的。蓝奏云下载地址:chrome-win32-63.7z2、解压到一个软件装置地位,关上可执行文件就能运行Chrome浏览器。 二、解决小问题1、关上浏览器提醒“短少 Google API密钥,因而chromium的局部性能将无奈应用”。 2、应用管路员权限关上CMD窗口,别离运行以下命令。setx GOOGLE_API_KEY "no"setx GOOGLE_DEFAULT_CLIENT_ID "no"setx GOOGLE_DEFAULT_CLIENT_SECRET "no" 3、再次关上chrome浏览器发现曾经没有那个提醒了。 三、chrome浏览器默认关上无痕浏览模式1、在快捷方式上右键,找到指标,在前面增加以下代码。-incognito 3、当初关上浏览器,曾经是无痕浏览模式 四、成果演示<div><video width="90%" height="" controls="controls" controlsList="nodownload"><source src="https://www.cztcms.cn/video/chromesp.mp4" type="video/mp4" ></source><object width="" height="" type="application/x-shockwave-flash" data="myvideo.swf"><param name="movie" value="myvideo.swf" /><param name="flashvars" value="autostart=true&file=myvideo.swf" /></object> </video></div>

July 17, 2020 · 1 min · jiezi

MongoDB-Zero2One-Base-CRUD

MongoDB CRUD OperationsCRUD operations create, read, update, and delete documents.All write operations in MongoDB are atomic on the level of a single document.MongoDB中所有基于单个document的写操作都是原子性的 启动MongoDB服务,再通过mongo命令开启Mongo Shell操作数据库进行CRUD 对于CRUD的操作:https://docs.mongodb.com/manu...对于Mongo Shell提供的办法:https://docs.mongodb.com/manu...Databases and CollectionsMongoDB stores BSON documents, i.e. data records, in collections; the collections in databases.MongoDB stores data records as BSON documents. BSON is a binary representation of JSON documents, though it contains more data types than JSON. For the BSON spec, see bsonspec.org. See also BSON Types. ...

July 10, 2020 · 2 min · jiezi

基于docker容器下mongodb-400-的Replica-SetsSharded-Cluster集群

指标`应用三台物理机做数据库集群任意一台宕机之后不会影响线上的业务运行 不会有任何的数据失落` 计划`采纳的是Replica Sets+Sharded Cluster的集群具备高可用,故障转移,分布式存储等个性` `依上图所示咱们此次集群配置如下: 三台物理机,每台物理机领有残缺的分片集群配置,都可独立运行 配置服务器:应用应用3个配置服务器确保元数据完整性。 路由(mongos)过程:应用3个路由过程实现均衡,进步客户端接入性能 3 个分片过程:Shard11,Shard12,Shard13 组成一个正本集,提供Sharding 中 Shard1 的性能。 3 个分片过程:Shard21,Shard22,Shard23 组成一个正本集,提供Sharding 中 Shard2 的性能。` 构建一个 mongoDB Sharding Cluster 须要三种角色:shard 服务器(ShardServer)、配置服务器(config Server)、路由过程(Route Process) Shard 服务器`shard 服务器即存储理论数据的分片,每个 shard 能够是一个 mongod 实例, 也能够是一组 mongod 实例形成的 Replica Sets.为了实现每个 Shard 外部的故障 主动转换,MongoDB 官网倡议每个 shard 为一组 Replica Sets.` 配置服务器`为了将一个特定的 collection 存储在多个 shard 中,须要为该 collection 指定 一个 shard key,决定该条记录属于哪个 chunk,配置服务器能够存储以下信息, 每个shard节点的配置信息,每个chunk的shard key范畴,chunk在各shard 的散布状况,集群中所有 DB 和 collection 的 sharding 配置信息。` ...

July 9, 2020 · 4 min · jiezi

MongoDB高手课学习记录第二十一天

重新启航没想到学习的进程一下中断了半年时间。最开始是因为项目的原因、之后是新年、然后是新冠……,当然,最重要的原因是懒,哈哈。 第二十一天今天要学习的是《24 | MongoDB开发最佳实践》节。这节是第二章的最后一篇文章,课程的链接点这里,是第二章课程的一个总结。 连接到MongoDB首先强调的一点就是,一定要选择与你所使用的版本相兼容的驱动程序,特别是使用程序框架的时候,否则会遇到一些无法解释的奇葩问题。驱动的兼容列表点这里。 连接字符串连接地址建议使用域名而不是IP,方便物理机出现故障时更换。 连接到复制集(建议写上所有的复制节点) mongodb://节点1,节点2,节点3.../database?[options]连接到分片集(写上mongos地址就行了) mongodb://mongos1,mongos2,mongos3.../database?[options]常用连接字符串参数参数说明maxPoolSize连接池大小不一定非要设置,有默认值的MaxWaitTime建议设置,慢查询超时时,后自动杀掉WriteConcern建议设置,用于保证数据的安全性ReadConcern不一定非要设置,有默认值,用于保证数据的一致性mongodb+srv:// 协议不用在连接串中写所有节点地址,而是通过虚拟域名来进行解析,3.6版本后支持。 mongos自带负载均衡连接字符串写全就行了,系统会自动处理连接到哪个mongos 游标的使用一般游标查询结束后,会自动关闭。如果查询太大,没自动关,可以调用close()方法手工关了,如果不关,10分钟后系统自动杀掉。 关于查询及索引理论上是要每个查询都需要有对应的索引,因为mongodb没有资源隔离,慢查询会影响系统的所有操作。尽量使用 Covered Indexes 索引(从索引里看出来要取的字段了,避免去读数据文件)。需要啥字段就读啥字段,别一下都读出来,然后到客户端再过滤,提高性能关于写入更新啥就写啥更新字段使用批量写入来提高性能使用TTL索引,来处理自动过期的日志类型的数据,到期会自动删除关于文档结构别使用太长的字段名,浪费存储空间数据嵌套别太多,虽然mongodb支持多层嵌套,别超过2层。使用英文字母来当字段名,别使用中文、标点符号等处理分页避免使用count,因为使用 count 的时候,有多少条记录都会逐条遍历一次。当然也避免使用skip/limit形式的分页,特别是数据量大的时候; db.coll.find({x: 100}).limit(50); db.coll.count({x: 100});那分页怎么办?没啥好办法! 替代方案:使用查询条件+唯一排序条件;例如:第一页:db.posts.find({}).sort({_id: 1}).limit(20);第二页:db.posts.find({_id: {$gt: <第一页最后一个_id>}}).sort({_id: 1}).limit(20); 第三页:db.posts.find({_id: {$gt: <第二页最后一个_id>}}).sort({_id: 1}).limit(20);关于事务不建议使用事务,效率太低建议通过模型设计来避免事务的使用,一个文档解决就好如果非要用,别使用大事务(这里指超过1000个文档的事务),小批量来处理,因为60秒默认超时限制必须使用事务时,也要让文档都分布在一个分片上(虽然支持存在多个分片上),提高性能最后好啦,今天的学习到此结束,明天开始学习第三章运维的部分,同时复习一下第二章的内容。

July 8, 2020 · 1 min · jiezi

22900-个-MongoDB-服务器被黑客入侵已备份并删库勒索比特币

技术编辑:徐九丨发自 思否编辑部 据外国媒体报道,有黑客入侵了 22900 个 MongoDB 数据库,备份并擦除了相关数据内容,要求 48 小时内支付 0.015 比特币(约合 140 美元)来进行恢复。据悉,被入侵的数据库大约占所有 MongoDB 在线访问数据库的 47%。 二流黑客造成的一级破坏 您的所有数据都已备份。您必须支付 0.015 BTC 到 xxxxxxxxx,48 小时后便可恢复。到期 48 小时后,我们将泄漏并公开您的所有数据。如果拒绝付款,我们将与 GDPR 《通用数据保护条例》的执法机构联系,并以开放形式通知他们您的商店用户数据并不安全。根据法律规定,您将面临重罚或逮捕,您的基本转储将从我们的服务器上删除!其实早在 2020 年 4 月,MongoDB 数据库就发现了植入该赎金记录(READ_ME_TO_RECOVER_YOUR_DATA)的攻击。但最初的攻击并不包括擦除数据的步骤。攻击者会重复连接到同一数据库,留下赎金记录,然后几天后再次返回并留下同一赎金记录的另一个副本。 但在此次的爆料中,黑客似乎已经意识到他们在脚本中犯的错误。黑客已经纠正了他们的脚本,并且已经开始清除 MongoDB 数据库中的部分数据。 通过这个事情,我们可以看到黑客的技术水平可能并不是很“到位”,但却能造成这么大的影响。数据库的安全风险可见一斑。 并不罕见的 MongoDB 风险最早在 2016 年 12 月,就有黑客意识到可以通过擦除 MongoDB 服务器并要求支付赎金的行为来赚钱大笔不义之财。 在 2017 年 1 月的一次黑客攻击中,超过 28000 台服务器被勒索;同年 9 月,又有 26000 台被勒索。 究其原因,早在 2017 年 MongoDB,Inc.产品安全高级总监 Davi Ottenheimer 就提出了原因并给用户发出了提醒,是数据库所有者未能为其数据库设置密码,然后使服务器暴露在网上而没有防火墙。 但似乎并没有起到什么用... ...

July 2, 2020 · 1 min · jiezi

MongoDB-常用查询操作

MongoDB 查询操作可实现大部分关系型数据库的常用查询操作,本文对 MongoDB 常用查询进行讲解。在阅读本文前,推荐先阅读《MongoDB 安装及文档的基本操作》 在进行操作讲解前,先展示当前 MongoDB 中已存在的文档,集合名称article 条件大小比较操作查询文档时,对条件的大小、范围进行过滤查询,以下是常用比较操作符 操作符说明$eq查询与条件值相等的文档,类似关系型数据库的 =$ne查询与条件值不相等或不存在的文档,类似关系型数据库的 !=$gt查询大于条件值的文档,类似关系型数据库的 >$gte查询大于或等于条件值的文档,类似关系型数据库的 >=$lt查询小于条件值的文档,类似关系型数据库的 <$lte查询小于或等于条件值的文档,类似关系型数据库的 <=$in查询 $in 数据里值的文档,类似关系型数据库的 in$nin与 $in 查询相反,类似关系型数据库的 not in由于使用大于、小于、等于关系都差不多,比较好理解,这里就举一个例子说明,使用$gte来获取大于或等于150的 visitor db.article.find({"visitor": {$gte:150}})执行结果: 使用$in时,必须用数组来设置条件值,比如获取 visitor 为70和150的值 db.article.find({"visitor": {$in:[70, 150]}})执行结果: 逻辑操作符多条件查询中,条件与条件连接符号叫做逻辑操作符。常用操作符: 操作符说明$and表示所有条件同时满足时成立$nor与$and相反,所有条件都不满足时成立$or只要有一个条件满足则成立$not表示字段存在并且不符合条件$and 查询author=ytao且visitor=150的文档 db.article.find( {$and:[ {"author":{$eq:"ytao"}}, {"visitor":{$eq:150}} ]})$nor查询不是author=ytao和不是visitor=170的文档 db.article.find( {$nor:[ {"author":{$eq:"ytao"}}, {"visitor":{$eq:170}} ]})$or查询author=ytao或visitor=170的文档 db.article.find( {$or:[ {"author":{$eq:"ytao"}}, {"visitor":{$eq:170}} ]})$not查询不是author=ytao的文档 db.article.find( {"author":{$not:{$eq:"ytao"}}})元素操作符对字段元素上的操作符叫做元素操作符 操作符说明$exists判断文档中字段是否存在,true为存在,false为不存在$type筛选指定字段类型的文档$exists查询author字段存在的文档 db.article.find( {"author":{$exists:true}})$type查询author字段为数组的文档 db.article.find( {"author":{$type:"array"}})正则表达式MongoDB 支持正则表达式匹配文档,通过正则表达我们可以实现关系型数据库的模糊查询,以及更加强大匹配规则,其使用语法有三种: { < field >: { $regex: /pattern/, $ options : '<options>' } }{ < field >: { $regex: 'pattern', $ options : '<options>' } }{ < field >: { $regex: /pattern/<options> } }参数/pattern/和'pattern'都是表示正则表达式,直接添加字符串可用来模糊查询。参数$options为可选参数,有四个固定值选择 ...

June 30, 2020 · 2 min · jiezi

Mongo数据库学习

第二章. MongoDB基础知识1 文档文档相当于关系型数据库中的row。 文档中的键值对是有序的。 2 集合一个集合就相当于一个表。 2.1 动态模式假设集合里面一个名为"type"的字段用于指明文档是水果还是蔬菜,那么应该将这两种不同类型的文档拆分成两个集合。 2.2 子集合(有疑问)使用“.”分割不同命名空间的子集合。在MongoDB中,使用子集合来组织数据非常高效,值得推荐。 3 数据库多个文档组成集合,多个集合组成数据库。 数据库名应全部小写。 数据库最终会变成文件系统中的文件,所以数据库名有很多限制。 自带保留数据库: admin对应“root”数据库,添加一个用户后,自动获取所有数据库权限。 local永不可复制 config存储分片信息 4 启动默认启动C:\data\db目录,不存在会报错。 5 MongoDB shellshell是一个功能完备的JavaScript解释器,可运行JavaScript程序。 Mongo可使用JavaScript标准库,定义和调用JavaScript函数。 db.help()查看数据库级别的帮助,db.foo.help()查看集合级别的帮助。 5.1 创建> db.blog.insert({"name":"Rohan","date":new Date()})5.2 读取find()shell会自动显示最多20个匹配的文档 findOne()5.3 更新update至少接受两个参数 6. 数据类型Mongo在JSON包含的六种数据类型:null、布尔、数字、字符串、数组和对象。的基础上新增了其他类型: null布尔型数值型默认64位浮点型数值,整型eg:{"x" : NumberInt("3")} 字符串日期{"x" : new Date()} 正则表达式{"x" : /foobar/i} 数组可以包含不同数据类型的元素 内嵌文档对象id{"x" : ObjectId()} 二进制数据代码可以包含任意JavaScript代码 第三章. CRUD3.1 插入db.foo.insert({"bar" : "baz"}) 批量插入batchInsert接收的参数是一个数组里面嵌套字典,此时会生成多个document,eg: db.foo.batchInsert([{"name" : "Rohan"},{"sex": "None"}]) 批量插入的最大消息为48MB,超过时,多数驱动程序会将这个请求拆分为多个48MB的请求。 批量插入时,某个文档失败时,之前插入的OK,后续的无法进行,如果期望忽略错误,可以使用continueOnError选项。 校验所有的文档必须小于16MB,Object.bsonsize(doc)查看文档大小 3.2 删除db.foo.remove({"可选":"键值对"}) 永久删除,不能撤销,不能恢复。 清空集合(表)db.foo.drop()速度更快 ...

June 21, 2020 · 1 min · jiezi

企业车辆太多难以管理是时候集成化管理了

随着社会经济的发展,各企业的事业单位的车辆保有量逐年上升,企业管理人面对各种用车成本及人员管理越来越困难,如何保证单位车辆安全、高效、科学的运营,如何防止管理成本增加和越来越复杂的车队调度、人员匹配、驾乘管理、事故处理,以及涉车事务等,是长期以来困扰许多企事业单位的一个管理难题,所以实施车辆管理系统,通过集成化管理信息管理,轻松处理车辆管理中的难题。 车辆管理系统的作用?1.规范管理车辆信息和驾驶员信息,及时反馈车辆状态。 在传统管理模式下一旦车辆驶出企业大门那么就变得极为不可控,无法及时传达。当企业职员需要及时用车时,没有办法第一时间了解企业的车辆情况,而使用车辆管理系统,所有驾驶员、车辆信息如:车牌号 , 车辆品牌 , 车辆型号 , 车身颜色 , 乘坐人数 , 购置价格 , 购置日期 , 随车证件,都可以清晰了解到。 2.避免了急需用车时,难以预约,提高工作效率。 当申请人需要用车时,只能口头预约,若不及时记录容易遗忘。在线上直接一键提交用车申请,管理人在线审核,如果急需用车时,还可提前做好B计划。 3.准时记录好各辆车的费用,方便统计报销情况,反馈财务。 当驾驶员使用后车辆后,行驶里程、用车费用人工统计麻烦。驾驶人把所有的行驶路费、油费等系列的费用,在线录入,自动统计,可视化管理,这样就可以准时记录好各辆车的费用,方便统计报销情况,反馈财务。 4.车辆状态,车辆用车情况及时反馈。 汽车出现事故原因、时间、地点等信息统一收集记录,管理系统自动统计车辆的行驶里程,车辆费用,不需要再次核对信息人工统计等一系列操作。 以上是白码无代码平台搭建的管理系统模板之一,不同企业需要的业务功能可能不一样,所以模板仅供参考,或者可以在这个模板的基础上进行更新和修改,尽可能的搭建出符合企业业务需求的管理系统。

June 9, 2020 · 1 min · jiezi

win7精简版怎么安装重装系统win10专业版

我们在使用win7操作系统的时候,有些情况下可能需要安装或者是重装我们需要的操作系统。那么对于win7精简版怎么安装重装系统这个问题小编觉得我们首先可以选择一个可靠的系统下载网站比如系统家园,然后下载系统之后再进行相关的安装步骤即可。那么具体的系统安装操作过程就来看看小编是怎么做的吧~ win7精简版怎么安装重装系统1、首先可以到系统之家下载Win7系统 2、打开下载的系统镜像文件,右击选择【解压Deepin_Win7SP1_Ultimate_X86_201407.iso】 3、解压完成后,双击【setup.exe】 4、点击【安装WIN7X86系统第一硬盘分区】 5、选择【安装】,再点击【确定】 6、安装成功后,点击【确定】 7、点击【打开】之后选择映像文件。ps:扩展名为.iso。最后选择【确定】 8、选择【是】,立即重启 9、因为是完全自动进行安装的,只需要等待硬盘装windows7系统完成即可 10、重启后,系统就安装好了 以上就是小编给各位小伙伴带来的win7精简版怎么安装重装系统的所有内容,希望你们会喜欢。 本文来源于win10专业版,转载请注明来源与出处。

June 2, 2020 · 1 min · jiezi

mongodb为日志表设置归档方案

背景现在mongodb有一张日志表,保留每天的系统访问信息,由于每天的数量非常大,导致长时间之后表变得非常大,影响插入效率,并且导致无法查询,现在我们需要制定方案来解决这个问题,需求是实现表的按时清理和归档。要求是尽量不修改项目现有的业务代码。并且现在数据库的大概每天产生30至60万条数据,能够平稳的处理。 解决方案方案一:集中清除: 假设在2019年的11月1号开始增加ttl设置为30天后的凌晨1点进行自动删除,然后我们每30天也就是2019年12月1号凌晨0点开始第一次备份数据,这是我们的数据库中会有一个月的数据,备份完成一小时后,开始删除当天数据,当下个月备份的时候,也就是1月1号,我们11月的数据已经自动删除完,这时进行备份,只有12月的数据。 方案二:分散清除: 备份方案与方案一相同,ttl设置为在日志生成后2592000秒(30天)后删除。 两种方案的区别: 第二种方案将删除分散到一天,将压力分散开;不需要更改原有代码只需要数据库设置索引第一种方案将删除放在凌晨,在服务器低峰删除;需要增加删除字段,并自定义删除时间最终选择实施方案一 原因:1. 不需要更改业务代码    2. 按照 mongodb设计如果删除数据时处于数据库高峰,会延后删除,(更改方案:将删除时间设为整天的时间加减某些量如5小时等,会生成错峰) 操作步骤设置mongodb的ttl索引,在一个选中的类型为date的字段上加上ttl索引,参考代码如下,具体实现参照百度。参照实现:ttl 数据库备份,参照百度,使用shell脚本定时备份。参照实现:备份 参考资料

November 2, 2019 · 1 min · jiezi

mongodb和mysql查询当前记录的上一条和下一条

思路:根据当前记录的id查询前后记录。 mongodb实现方法:mongo可以通过时间或者通过id来判断上一条记录或者下一条记录: 通过记录的_id上一条记录 db.数据库名称.find({ '_id': { '$lt': ids } }).sort({_id: -1}).limit(1)下一条记录 db.数据库名称.find({ '_id': { '$gt': ids } }).sort({_id: 1}).limit(1)通过时间字段来查询:上一条记录 db.数据库名称.find({ 'created': { '$lt': created } }).sort({_id: -1}).limit(1)下一条记录 db.数据库名称.find({ 'created': { '$gt': created } }).sort({_id: 1}).limit(1)mysql实现方法:mysql查询,网上有很多方法,通常我们用如下方法: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from table_a where id = (select id from table_a where id < {$id} [and other_conditions] order by id desc limit 1 ) [and other_conditions];查询下一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from table_a where id = (select id from table_a where id > {$id} [and other_conditions] order by id asc limit 1 ) [and other_conditions];

November 2, 2019 · 1 min · jiezi

Exception-in-monitor-thread-while-connecting-to-server-localhost

项目没有使用 MongoDB 却每次启动时会出现如下异常信息: 10:41:41.288 [main] INFO o.m.d.cluster - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}10:41:41.361 [cluster-ClusterId{value='5dae6c654d4299250bde1b44', description='null'}-localhost:27017] INFO o.m.d.cluster - Exception in monitor thread while connecting to server localhost:27017com.mongodb.MongoSocketOpenException: Exception opening socket at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) at java.lang.Thread.run(Thread.java:748)Caused by: java.net.ConnectException: 拒绝连接 (Connection refused) at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ... 3 common frames omitted解决方法// 在 Application 主类上添加注解// 方式一:@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})// 方式二:@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})相关文档: ...

October 22, 2019 · 1 min · jiezi

MongoDB系列轻松应对面试中遇到的MongonDB索引index问题

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中( 索引存储在特定字段或字段集的值),而且是使用了B-tree结构。索引可以极大程度提升MongoDB查询效率。 如果没有索引,MongoDB必须执行全集合collections扫描,即扫描集合中的每个文档,选取符合查询条件的文档document。 如果查询时存在适当的索引,MongoDB可以使用索引来限制它必须查询的文档document的数量,特别是在处理大量数据时,所以选择正确的索引是很关键的、重要的。 创建索引,需要考虑的问题: 每个索引至少需要数据空间为8kb;添加索引会对写入操作会产生一些性能影响。 对于具有高写入率的集合Collections,索引很昂贵,因为每个插入也必须更新任何索引;索引对于具有高读取率的集合Collections很有利,不会影响没索引查询;处于索引处于action状态时,每个索引都会占用磁盘空间和内存,因此需要对这种情况进行跟踪检测。索引限制: 索引名称长度不能超过128字段;复合索引不能超过32个属性;每个集合Collection不能超过64个索引;不同类型索引还具有各自的限制条件。1. 索引管理1.1 索引创建索引创建使用createIndex()方法,格式如下: db.collection.createIndex(<key and index type specification>,<options>)createIndex() 接收可选参数,可选参数列表如下: ParameterTypeDescriptionbackgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.1.2 查看索引查看Collection中所有索引,格式如下: db.collection.getIndexes()1.3 删除索引删除Collection中的索引:格式如下: db.collection.dropIndexes() //删除所有索引db.collection.dropIndex() //删除指定的索引 1.4 索引名称索引的默认名称是索引键和索引中每个键的value1或-1,形式index_name+1/-1,比如: db.products.createIndex( { item: 1, quantity: -1 } )----索引名称为item_1_quantity_-1也可以指定索引名称: db.products.createIndex( { item: 1, quantity: -1 } , { name: "inventory" } ) ----索引名称为inventory1.5 查看索引创建过程以及终止索引创建方法解析db.currentOp()查看索引创建过程db.killOp(opid)终止索引创建,其中-opid为操作id1.6 索引使用情况形式解析&dollar;indexStats获取索引访问信息explain()返回查询情况:在executionStats模式下使用db.collection.explain()或cursor.explain()方法返回有关查询过程的统计信息,包括使用的索引,扫描的文档数以及查询处理的时间(以毫秒为单位)。Hint()控制索引,例如要强制MongoDB使用特定索引进行db.collection.find()操作,请使用hint()方法指定索引1.7 MongoDB度量标准MongoDB提供了许多索引使用和操作的度量标准,在分析数据库的索引使用时可能需要考虑这些度量标准,如下所示: 形式解析metrics.queryExecutor.scanned在查询和查询计划评估期间扫描的索引项的总数metrics.operation.scanAndOrder返回无法使用索引执行排序操作的已排序数字的查询总数collStats.totalIndexSize所有索引的总大小。 scale参数会影响此值。如果索引使用前缀压缩(这是WiredTiger的默认值),则返回的大小将反映计算总计时任何此类索引的压缩大小。collStats.indexSizes指定集合collection上每个现有索引的键和大小。 scale参数会影响此值dbStats.indexes包含数据库中所有集合的索引总数的计数。dbStats.indexSize在此数据库上创建的所有索引的总大小1.8 后台索引操作 在密集(快达到数据库最大容量)Collection创建索引:在默认情况下,在密集的Collection(快达到数据库最大容量)时创建索引,会阻止其他操作。在给密集的Collection(快达到数据库最大容量)创建索引时,索引构建完成之前,保存Collection的数据库不可用于读取或写入操作。 任何需要对所有数据库(例如listDatabases)进行读或写锁定的操作都将等待不是后台进程的索引构建完成。 ...

October 17, 2019 · 6 min · jiezi

BeginnersBook-MongoDB-教程

来源:ApacheCN BeginnersBook 翻译项目译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百科)目录NoSQL 数据库简介MongoDB 简介将关系数据库映射到 MongoDB如何为 Windows 安装和配置 MongoDB在 MongoDB 中创建数据库删除 MongoDB 中的数据库在 MongoDB 中创建集合删除 MongoDB 中的集合MongoDB 插入文档MongoDB 使用find()方法查询文档MongoDB - 更新集合中的文档MongoDB 从集合中删除文档MongoDB 投影MongoDB - limit()和skip()方法MongoDB sort()方法MongoDB 索引教程另见C 语言教程C 语言示例C++ 教程数据库教程Java 教程Java 集合教程Java 示例Java IO 教程Java 字符串教程JSP 教程JSTL 教程Kotlin 教程MongoDB 教程Perl 教程Servlet 教程

October 16, 2019 · 1 min · jiezi

模型设计对博客中评论的合理建模-MongoDB

最近,闲着没事,又把上个月写得代码拿出来了,随便完善一下没完成的评论的路由接口。 评论应该是在整个博客数据存储中,模型最为复杂的一部分了。首先要考虑的是和文章进行关联。这个可以用 mongoDB 的 ref 进行关联,随后可以使用 populate 计算出被关联的字段。 最后关系复杂的是父子层级的评论,又或者是多级评论。这个时候就要想该怎么做才能合理的管理这些层级关系,在删除父评论的同时又能把所有子评论一起删除。查询的时候如何去由根到叶顺序输出层级关系。 建立评论模型const schema = new mongoose.Schema({ // comment id cid: { type: Number, required: true, unique: true }, // post id pid: { type: Number, required: true }, post: { type: mongoose.SchemaTypes.ObjectId, ref: 'Post' }, content: { type: String, required: true }, createTime: { type: Number, default: Date.now() }, author: { type: String, required: true }, owner: { type: String, required: true }, isOwner: { type: Boolean, required: true }, email: { type: String }, url: { type: String }, key: { type: String, required: true, unique: true }, parent: { type: mongoose.SchemaTypes.ObjectId, ref: 'Comment' }, hasChild: { type: Boolean, default: false }, ipAddress: { type: String, required: true }, userAgent: { type: String }, // 0 审核 1 发布 2 垃圾 state: { type: Number, required: true, default: 0 }})在模型中,post列中关联引用表(post表)的 _id(文章),在 hasChild 中记录是否存在回复。在后期处理回复路由的时候不要忘记修改他的值。最关键的是 key 列,这个用来记录平行层级。如 post 中的一篇 pid 为 11 的文章下有一条评论,那么 key 中命名 11#001,这是第一条评论,如果该评论下存在一条回复,则回复的 key 为 11#001#001,下层亦是如此。使用该命名方式可以容纳的每条评论的回复量为 999,可以根据需求调整0的数量。 ...

October 14, 2019 · 2 min · jiezi

EMQ-X-规则引擎系列七存储消息到-MongoDB-数据库

MongoDB 介绍非关系数据库(NoSQL) 用于超大规模数据的存储,例如谷歌或 Facebook 每天为他们的用户收集万亿比特的数据。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB 由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统,MongoDB 旨在为数据存储提供可扩展的高性能数据存储解决方案,在高负载的情况下,可以轻松添加更多的节点保证服务性能。 MongoDB 将数据存储为一个文档,数据结构由键值 (key=>value) 对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。 MongoDB 下载地址:https://www.mongodb.com/download-center/community 场景介绍该场景需要将 EMQ X 指定主题下满足某条件的消息存储到 MongoDB 数据库。为了便于后续分析检索,消息内容需要进行拆分存储。 该场景下设备端上报信息如下: 上报主题:cmd/state/:id,主题中 id 代表车辆客户端识别码消息体: { "id": "NXP-058659730253-963945118132721-22", // 客户端识别码 "speed": 32.12, // 车辆速度 "direction": 198.33212, // 行驶方向 "tachometer": 3211, // 发动机转速,数值大于 8000 时才需存储 "dynamical": 8.93, // 瞬时油耗 "location": { // GPS 经纬度数据 "lng": 116.296011, "lat": 40.005091 }, "ts": 1563268202 // 上报时间}当上报数据发动机转速数值大于 8000 时,存储当前信息以便后续分析用户车辆使用情况。 ...

October 8, 2019 · 2 min · jiezi

MongoDB-BI-Connector-实战指南

MongoDB 使用 BI Connector 来支持 BI 组件直接使用 SQL 或 ODBC 数据源方式直接访问 MongoDB,在早期 MongoDB 直接使用 Postgresql FDW 来实现 SQL 到 MQL 的转换,后来实现更加轻量级的 mongosqld 来支持 BI 工具的连接。 安装 BI Connector参考 Install BI Connector wget https://info-mongodb-com.s3.amazonaws.com/mongodb-bi/v2/mongodb-bi-linux-x86_64-rhel70-v2.12.0.tgz$tar xvf mongodb-bi-linux-x86_64-rhel70-v2.12.0.tgzmongodb-bi-linux-x86_64-rhel70-v2.12.0/LICENSEmongodb-bi-linux-x86_64-rhel70-v2.12.0/READMEmongodb-bi-linux-x86_64-rhel70-v2.12.0/THIRD-PARTY-NOTICESmongodb-bi-linux-x86_64-rhel70-v2.12.0/example-mongosqld-config.ymlmongodb-bi-linux-x86_64-rhel70-v2.12.0/bin/mongosqldmongodb-bi-linux-x86_64-rhel70-v2.12.0/bin/mongodrdlmongodb-bi-linux-x86_64-rhel70-v2.12.0/bin/mongotranslatemongosqld 接受 SQL 查询,并将请求发到 MongoDB Server,是 BI Connector 的核心mongodrdl 工具生成数据库 schema 信息,用于服务 BI SQL 查询mongotranslate 工具将 SQL 查询转换为 MongoDB Aggregation Pipeline启动 mongosqld参考 Lauch BI Connector mongodb-bi-linux-x86_64-rhel70-v2.12.0/bin/mongosqld --addr 127.0.0.1:3307 --mongo-uri 127.0.0.1:9555--addr 指定 mongosqld 监听的地址--mongo-uri 指定连接的 MongoDB Server 地址默认情况下,mongosqld 自动会分析目标 MongoDB Server 里数据的 Schema,并缓存在内存,我们也可以直接在启动时指定 schema 影射关系。schema 也可以直接 mongodrdl 工具来生成,指定集合,可以将集合里的字段 shema 信息导出。 ...

October 8, 2019 · 2 min · jiezi