【Mongo DB】万字详解,Mongo DB的简介到实战使用(下)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 今天主要为大家提供一条龙服务,从Mongo DB的简介到实战使用,使我们面对技术选型的时候可以得心应手。

索引

MongoDB 的索引是基于 B-tree 数据结构及对应算法形成的。_id默认会创建索引

网络异常,图片无法展示
|

索引类型

单列索引

除了 MongoDB 定义的 _id 索引之外,MongoDB 还支持在文档的单个字段上创建用户定义的升序/降序索引。

网络异常,图片无法展示
|

>db.collection.createlndex ( { source: 1 } )  //1 为升序,-1 为降序

复合索引

MongoDB 也支持复合索引,并且复合索引的规则和MySQL基本一致。复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由 { userid: 1, score: -1 } 组成,则索引首先按userid正序排序,然后在每个userid的值内,再在按score倒序排序。

网络异常,图片无法展示
|

>db.collection.createIndex ({ "score": -1, "userid": 1 })

多键索引

若要为包含数组的字段建立索引,MongoDB 会为数组中的每个元素创建索引键。这些多键值索引支持对数组字段的高效查询

网络异常,图片无法展示
|

索引新增删除

  • 创建索引
db.collection.createIndex( { name: -1 } )
db.user.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: 1 }, name: 'name_1' }
]
Atlas atlas-119lob-shard-0 [primary] test> db.user.createIndex({name: 1},{name:"idx_name"})
idx_name
Atlas atlas-119lob-shard-0 [primary] test> db.user.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: 1 }, name: 'idx_name' }
]
  • 删除索引
db.user.dropIndexes("name_1")

执行计划

explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。

  • queryPlanner:输出索引的候选索引,包括最优索引及其执行stage过程(winningPlan)+其他非最优候选索引及其执行stage过程
  • executionStats:相比queryPlanner参数,executionStats会记录查询优化器根据所选最优索引执行SQL的整个过程信息,会真正执行整个SQL。
  • allPlansExecution:和executionStats类似,只是多了所有候选索引的执行过程

新增10000条测试数据

for (let i = 1; i <= 500000; i++) db.item.insertOne({_id:i, item_id: "10010_" + i, item_order: "P1HNHN" + i, test:"test_"+i+"TES"})
Atlas atlas-119lob-shard-0 [primary] order> db.item.find({item_id:"10010_38976"}).explain("executionStats")
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'order.item',
    indexFilterSet: false,
    parsedQuery: { item_id: { '$eq': '10010_38976' } },
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'COLLSCAN',
      filter: { item_id: { '$eq': '10010_38976' } },
      direction: 'forward'
    },
    rejectedPlans: []
  },
  executionStats: {
    executionSuccess: true,
    nReturned: 1,
    executionTimeMillis: 23,
    totalKeysExamined: 0,
    totalDocsExamined: 50000,
    executionStages: {
      stage: 'COLLSCAN',
      filter: { item_id: { '$eq': '10010_38976' } },
      nReturned: 1,
      executionTimeMillisEstimate: 2,
      works: 50002,
      advanced: 1,
      needTime: 50000,
      needYield: 0,
      saveState: 50,
      restoreState: 50,
      isEOF: 1,
      direction: 'forward',
      docsExamined: 50000
    }
  },
  command: { find: 'item', filter: { item_id: '10010_38976' }, '$db': 'order' },
  serverInfo: {
    host: 'cluster0-shard-00-02.fdv5c.mongodb.net',
    port: 27017,
    version: '5.0.8',
    gitVersion: 'c87e1c23421bf79614baf500fda6622bd90f674e'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 16793600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 33554432,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600
  },
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp(1, 1651821606),
    signature: {
      hash: Binary(Buffer.from("9250e56618dba0aacb504c846045c8e534adb68f", "hex"), 0),
      keyId: Long("7066952799589761026")
    }
  },
  operationTime: Timestamp(1, 1651821606)
}

在item_id上创建索引

db.item.createIndex ({ "item_id": 1},{"name":"idx_item_id" })
Atlas atlas-119lob-shard-0 [primary] order> db.item.find({item_id:"10010_38976"}).explain("executionStats")
{
  explainVersion: '1',
  queryPlanner: {
    namespace: 'order.item',
    indexFilterSet: false,
    parsedQuery: { item_id: { '$eq': '10010_38976' } },
    maxIndexedOrSolutionsReached: false,
    maxIndexedAndSolutionsReached: false,
    maxScansToExplodeReached: false,
    winningPlan: {
      stage: 'FETCH',
      inputStage: {
        stage: 'IXSCAN',
        keyPattern: { item_id: 1 },
        indexName: 'idx_item_id',
        isMultiKey: false,
        multiKeyPaths: { item_id: [] },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: { item_id: [ '["10010_38976", "10010_38976"]' ] }
      }
    },
    rejectedPlans: []
  },
  executionStats: {
    executionSuccess: true,
    nReturned: 1,
    executionTimeMillis: 0,
    totalKeysExamined: 1,
    totalDocsExamined: 1,
    executionStages: {
      stage: 'FETCH',
      nReturned: 1,
      executionTimeMillisEstimate: 0,
      works: 2,
      advanced: 1,
      needTime: 0,
      needYield: 0,
      saveState: 0,
      restoreState: 0,
      isEOF: 1,
      docsExamined: 1,
      alreadyHasObj: 0,
      inputStage: {
        stage: 'IXSCAN',
        nReturned: 1,
        executionTimeMillisEstimate: 0,
        works: 2,
        advanced: 1,
        needTime: 0,
        needYield: 0,
        saveState: 0,
        restoreState: 0,
        isEOF: 1,
        keyPattern: { item_id: 1 },
        indexName: 'idx_item_id',
        isMultiKey: false,
        multiKeyPaths: { item_id: [] },
        isUnique: false,
        isSparse: false,
        isPartial: false,
        indexVersion: 2,
        direction: 'forward',
        indexBounds: { item_id: [ '["10010_38976", "10010_38976"]' ] },
        keysExamined: 1,
        seeks: 1,
        dupsTested: 0,
        dupsDropped: 0
      }
    }
  },
  command: { find: 'item', filter: { item_id: '10010_38976' }, '$db': 'order' },
  serverInfo: {
    host: 'cluster0-shard-00-02.fdv5c.mongodb.net',
    port: 27017,
    version: '5.0.8',
    gitVersion: 'c87e1c23421bf79614baf500fda6622bd90f674e'
  },
  serverParameters: {
    internalQueryFacetBufferSizeBytes: 104857600,
    internalQueryFacetMaxOutputDocSizeBytes: 104857600,
    internalLookupStageIntermediateDocumentMaxSizeBytes: 16793600,
    internalDocumentSourceGroupMaxMemoryBytes: 104857600,
    internalQueryMaxBlockingSortMemoryUsageBytes: 33554432,
    internalQueryProhibitBlockingMergeOnMongoS: 0,
    internalQueryMaxAddToSetBytes: 104857600,
    internalDocumentSourceSetWindowFieldsMaxMemoryBytes: 104857600
  },
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp(2, 1651821695),
    signature: {
      hash: Binary(Buffer.from("035c24b6cc83e5d1d5bca97befb43a2c2fc30605", "hex"), 0),
      keyId: Long("7066952799589761026")
    }
  },
  operationTime: Timestamp(2, 1651821695)
}

事务

什么是writeConcern?

writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:

  • 0:发起写操作,不关心是否成功;
  • 1~集群最大数据节点数:写操作需要被复制到指定节点数才算成功;
  • majority:写操作需要被复制到大多数节点上才算成功。

发起写操作的程序将阻塞到写操作到达指定的节点数为止

网络异常,图片无法展示
|

majority

网络异常,图片无法展示
|

副本集

MongoDB的副本集主要用于实现服务的高可用。

  • 数据写入时将数据迅速复制到其他节点上
  • 在Primary节点出现故障后自动选举一个Secondary节点作为Primary

网络异常,图片无法展示
|

Golang操作MongoDB

var client *mongo.Client
type Item struct {
  ItemId string `bson:"item_id"`
  ItemOrder string `bson:"item_order"`
  Test string `bson:"test"`
  UpdateTime string `bson:"update_time"`
}
func main() {
  initDB()
  collection := client.Database("order").Collection("item")
  result, err := collection.InsertOne(context.TODO(), &Item{
    ItemId:     "test_item_id",
    ItemOrder:  "test_item_order",
    Test:       "test_test",
    UpdateTime: time.Now().Format("2006-01-02 15:04:05"),
  })
  if err != nil{
    log.Fatal(err)
  }
  fmt.Println(result.InsertedID)
  // find()
}
func find(){
  initDB()
  collection := client.Database("order").Collection("item")
  cursor, err := collection.Find(context.TODO(), bson.D{{"itemid", "test_item_id"}})
  if err != nil {
    log.Fatal(err)
  }
  defer cursor.Close(context.TODO())
  for cursor.Next(context.TODO()) {
    item := &Item{}
    err := cursor.Decode(item)
    if err != nil {
      log.Fatal(err)
    }
    fmt.Println(item)
  }
}
func initDB() {
  clientOptions := options.Client().ApplyURI(url)
  ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  defer cancel()
  c, err := mongo.Connect(ctx, clientOptions)
  if err != nil {
    log.Fatal(err)
  }
  err3 := c.Ping(ctx, nil)
  if err3 != nil {
    log.Fatal(err3)
  }
  fmt.Println("mongodb connected")
  client = c
}

相关文章
|
9月前
|
存储 NoSQL API
微服务——MongoDB实战演练——需求分析
本文档《5-MongoDB实战演练》聚焦于某头条文章评论业务的需求分析与功能实现。基于MongoDB,需完成以下功能:1)提供基本的增删改查API;2)支持通过文章ID查询相关评论;3)实现评论点赞功能。结合实际业务场景,演示MongoDB在数据存储与操作中的应用,附带示意图帮助理解业务结构。
141 2
微服务——MongoDB实战演练——需求分析
|
9月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章评论的基本增删改查
本节介绍了文章评论的基本增删改查功能实现。首先,在`cn.itcast.article.dao`包下创建数据访问接口`CommentRepository`,继承`MongoRepository`以支持MongoDB操作。接着,在`cn.itcast.article.service`包下创建业务逻辑类`CommentService`,通过注入`CommentRepository`实现保存、更新、删除及查询评论的功能。最后,新建Junit测试类`CommentServiceTest`,对保存和查询功能进行测试,并展示测试结果截图,验证功能的正确性。
199 2
|
9月前
|
NoSQL Java MongoDB
微服务——MongoDB实战演练——文章评论实体类的编写
本节主要介绍文章评论实体类的编写,创建了包`cn.itcast.article.po`用于存放实体类。具体实现中,`Comment`类通过`@Document`注解映射到MongoDB的`comment`集合,包含主键、内容、发布时间、用户ID、昵称等属性,并通过`@Indexed`和`@CompoundIndex`注解添加单字段及复合索引,以提升查询效率。同时提供了Mongo命令示例,便于理解和操作。
162 2
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——MongoTemplate实现评论点赞
本节介绍如何使用MongoTemplate实现评论点赞功能。传统方法通过查询整个文档并更新所有字段,效率较低。为优化性能,采用MongoTemplate对特定字段直接操作。代码中展示了如何利用`Query`和`Update`对象构建更新逻辑,通过`update.inc(&quot;likenum&quot;)`实现点赞数递增。测试用例验证了功能的正确性,确保点赞数成功加1。
192 0
|
9月前
|
NoSQL 测试技术 MongoDB
微服务——MongoDB实战演练——根据上级ID查询文章评论的分页列表
本节介绍如何根据上级ID查询文章评论的分页列表,主要包括以下内容:(1)在CommentRepository中新增`findByParentid`方法,用于按父ID查询子评论分页列表;(2)在CommentService中新增`findCommentListPageByParentid`方法,封装分页逻辑;(3)提供JUnit测试用例,验证功能正确性;(4)使用Compass插入测试数据并执行测试,展示查询结果。通过这些步骤,实现对评论的高效分页查询。
155 0
|
9月前
|
NoSQL MongoDB 微服务
微服务——MongoDB实战演练——文章微服务模块搭建
本节介绍文章微服务模块的搭建过程,主要包括以下步骤:(1)创建项目工程 *article*,并在 *pom.xml* 中引入依赖;(2)配置 *application.yml* 文件;(3)创建启动类 *cn.itcast.article.ArticleApplication*;(4)启动项目,确保控制台无错误提示。通过以上步骤,完成文章微服务模块的基础构建与验证。
128 0
|
5月前
|
JSON NoSQL Shell
MongoDB简介
MongoDB 是一款开源、高性能、无模式的文档型数据库,属于 NoSQL 产品,支持灵活的 BSON 数据格式,结构类似 JSON,适合存储复杂数据。它以文档为最小存储单位,具备高性能、高可用、高扩展性,支持丰富查询及多种数据类型,适用于大规模数据场景。
478 0
|
9月前
|
NoSQL MongoDB 数据库
微服务——MongoDB实战演练——表结构分析
本文档来源于数据库articledb,展示了一张图片资源。图片宽度为1207像素,高度607像素,采用内联显示方式。内容涉及图像处理与样式设定,适用于文档或网页设计中多媒体元素的布局参考。图片来源为cdn.nlark.com,支持webp格式并附带水印处理。
130 1
微服务——MongoDB实战演练——表结构分析
|
9月前
|
NoSQL Java 数据库连接
微服务——MongoDB实战演练——技术选型
本节主要介绍技术选型中的两个重要工具:**mongodb-driver** 和 **SpringDataMongoDB**。其中,mongodb-driver 是 MongoDB 官方提供的 Java 驱动包,用于连接和操作 MongoDB 数据库,功能类似 JDBC 驱动。通过官方示例可快速上手。而 SpringDataMongoDB 是 Spring 生态的一员,封装了 mongodb-driver,提供了更简洁的 API,方便开发者在 Spring 环境中操作 MongoDB。两者各有优势,可根据实际需求选择合适的技术方案。
170 2
|
9月前
|
NoSQL MongoDB 数据库
【直播回放】MongoDB全球开发者认证介绍线上直播 助力您掌握企业级实战能力
想通过MongoDB认证提升竞争力却无从下手?这场线上直播为你解惑!权威解读考试大纲、题型与评分标准,资深专家分享备考策略,涵盖学习计划、实战技巧及心理调整。更有最新认证激励政策、专属徽章与大礼包等你解锁!无论你是开发者、管理员还是学生,都能为职业发展铺路。立即预约3月26日直播回放,与MongoDB专家互动答疑,轻松迈向专业高峰!

推荐镜像

更多