深入学习MongoDB---1---入门篇+基础重点篇

news2024/12/27 11:45:55

MongoDB入门

  • MongDB作为NoSQL数据库之一,主要关注:灵活性、扩展性、高可用
  • 灵活性:NoSQL的特点就是反范式理论,为数据的水平扩展和字段的组织提供了巨大的便利
  • 高可用:天生就伴随副本集(从节点)的概念,通过Raft算法实现集群的高可用;
  • 扩展性:拥有分片机制,不需要应用程序或者插件就能实现数据分片和分片集群的搭建,只需要启动一个分片服务器、分片配置服务器、路由服务器即可自动进行分片和分片查询
  • MongoDB是最接近关系数据库的非关系型数据库,提供了关系数据库的众多核心功能,实现了其中众多核心概念:
    • 索引机制
    • 存储引擎和存储函数:WiredTiger存储引擎、js的存储函数;
    • 事务机制:ACID和Base理论的结合
    • 日志系统慢查询、journal log(redo log)、oplog
    • 类SQL的查询(甚至支持Lookup左连接查询)

基础

快速入门

数据结构

数据结构(逻辑)

image-20220421161434968

SQLMongoDB备注
databasedatabase
tablecollection
rowdocument
columnfield
primary keyprimary key主键
indexindex索引
viewview视图
  • 支持视图、索引、事务、数据分片和分布式管理
  • 通过命名空间进行操作,一般MongoDB有三层命名空间
    • databse
    • collection
    • document
  • 文档的id一般由**:时间戳、客户端ID、客户进程ID、三个字节的增量计数器**组成
  • MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中。
数据模型
  • 前面学习NoSQl的时候已经介绍过,作为反范式,MongoDB可以灵活保存数据

    • 可以没有任何文档结构(数据模型)约束
    • 文档的属性也可以没有任何约束
  • 文档校验:处于规范,很多时候我们需要对文档进行约束

    • 校验器(validator):MongoDB通过校验器校验数据和文档格式是否合法
      • 拒绝策略:
        • error:报错
        • warn:继续保存,但是发出警告
    • 跳过校验通过bypassDocumentValidation跳过校验
校验器
  • required : 数据可以是任意类型,表示这个数据必须传入
  • max: 用于Number 类型数据,最大值
  • min: 用于Number 类型数据,最小值
  • enum:枚举类型(数组中的类型是String),要求数据必须满足枚举值enum: [‘0’, ‘1’, ‘2’]
  • match:增加的数据必须符合match(正则)的规则
  • maxlength:数据必须是String类型,数据最大长度
  • minlength:数据必须是String类型,数据最小长度
  • bsonType:数据类型
validator: {										   #校验器
      $jsonSchema: {                               		  #json数据格式约束
         bsonType: "object",							#类型
         required: [ "name", "year", "major", "address" ], #必须的字段
         properties: {									#字段规则
            name: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            year: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               description: "must be an integer in [ 2017, 3017 ] and is required"
            },
            major: {
               enum: [ "Math", "English", "Computer Science", "History", null ],
               description: "can only be one of the enum values and is required"
            },
            gpa: {
               bsonType: [ "double" ],
               description: "must be a double if the field exists"
            },
            address: {
               bsonType: "object",
               required: [ "city" ],
               properties: {
                  street: {
                     bsonType: "string",
                     description: "must be a string if the field exists"
                  },
                  city: {
                     bsonType: "string",
                     "description": "must be a string and is required"
                  }
               }
            }
         }
      }
   }
数据结构(物理)
  • JSON格式存取
  • BSON格式保存(BSON就是JSON的二进制形式,并且增强了JSON)
  • 数据最终通过B-Tree的形式在文件系统中组织存储;

数据库基本操作

  • options是操作可以携带的条件,同样是key-value形式
数据库操作
  • 数据库增删改查
    • 使用:use
      • 增:在use的数据库中插入数据即可(如果没有该数据库则创建、有则插入数据)
      • 删:db.dropDatabase()
        • 删除use的数据库
      • 查:show dbs
  • 用户
    • 切换用户use usernam
    • 登录:auth(“用户名”,“密码”)
    • 创建用户:db.createUser
  • 视图
  • 索引
集合操作
  • 增删改查
    • 增:db.createCollection(name,options)
      • 可选的options:
      • image-20220421155851555
    • 删:db.集合名.drop()
    • 改:
      • 查看该数据库全部集合:show collections()
      • 查看某一个集合的状态:db.集合名称.stats()

文档操作(集合操作文档)

  • MongoDB通过BSON格式保存文档数据,BSON由一个到多个key-value键值对组成;

  • 文档就像关系数据库的具体数据一样,操作是通过collection进行;

  • 文档操作类似关系数据库,主要分为

    • select子句:
    • where子句
    • limit子句
    • group by子句
    • order by子句
  • 命令:

    • 增删改:

      db.<collectionName>.<操作>()
      
    • db.<collectionName>
      .find(
      	{query},#where子句
      	{fields}#select子句(一般指定查询的field字段)
      )
      .group()#group子句
      .sort()#order by子句
      .limit().skip()#limit子句
      
  • insertOne

  • insertMany

  • insert

  • # db.<collectionName>.insert({data},{options})
    db.test1.insert({
    	"name":"www",
    	"hhh":123
    	})
    	
    #db.<collectionName>.insertMany([{data}……],{options})
    db.test.insertMany(
        [
            {"name":"lili","age":19},
            {"name":"liyi","age":20},
            {"name":"liuliu","age":21}
        ]
    )
    
  • 有delete和remove俩种删除方法(推荐使用delete)

    • deleteOne
    • deleteMany
    • remove
  • # db.<collectionName>.remove(<query>,{options})
    db.test1.remove({
    	{"tid":"test"},#query,相当于SQL的where
    	{"justOne":true}#只删除一条记录
    	})
    
    db.test1.insert(
       { item: "envelopes", qty : 100, type: "Clasp" },
       { writeConcern: { w: "majority" , wtimeout: 5000 } } #开启写关注
    )
    
  • 改主要有两种手段:覆盖(save、replace)、查询修改(update)

    • updateOne
    • updateMany
    • update
    • save
    • replaceOne
  • 主要操作

    • $set:修改
    • $unset:删除字段
    • $push:添加元素(一般用在数组)
    • $inc:数值+x
  • #覆盖,save覆盖一般需要携带_id,来覆盖指定id的文档
    	# db.<collectionName>.save(data,{options})
    db.test1.save("_id":ObjectId("xxxxxxxxxx"),其他数据部分,{options})
    
    #更新
    	# db.<collectionName>.update(<query>,<update{data},update{date}……>,{options})
    	#update:$set、$inc等
    db.test1.update({},{$set:{'title':'HHHH'},{options}})
    
  • 支持组合操作、支持批量操作

  • image-20220423121257030
  • # db.<collectionName>.find(<query>,<fields>)
    db.test1.find({}) #查询所有
    
    #查询名字为lili的age字段 SELECT age FROM test1 WHERE name = 'lili'
    db.test1.find({"name":"lili"},{"age":1}) 
    
    db.test.find({$or: [{"age": {$gt:22}},{name:"www"}]})
    
query子句
  • 即SQL的where子句,

    • 支持聚合运算
    • 支持数值运算、条件运算(in、or、and、等于、大于、大于等于、小于、小于等于、不等于)、
    • 正则表达式
    • 模糊查询
    • exists和not exists
  • 数值运算

    • “key”:{<运算符>:数值}

      • 运算符:
        • 大于:$gt
        • 大于等于:$gte
        • 小于:$lt
        • 小于等于:$lte
        • 不等于: $ne
    • #score大于等于50分
      {
      	'score':{$gte:50}
      }
      # 等于
      {
      	'score':50
      }
      
  • IN

    • $in

    • { 
      	'status': { $in: [ "A", "D" ] } 
      }
      
  • 条件运算

    • 或:$or

    • #score大于90或者num小于80
      {
      	$or : [
      		{'score':{$gt:90}},
      		{'num':{$lt:80}}
      	]
      }
      
      #与操作
      	#score大于90并且num小于80
      {
      	'score':{$gt:90},
      	'num':{$lt:80}
      }
      
  • 模糊查询和正则表达式

    • MongoDB支持正则表达式操作符$regex来做字符串模式匹配。

    • {
      	'title': /^震惊/ #以震惊开头
      }
      
内置函数
  • 主要有:

    • 事务相关
      • snapshot
      • readConcern
      • readRef
    • 统计相关
      • explain:类似SQL的expail,用于分析
      • count:统计数量
    • 聚合相关
      • limit和skip:SQL的limit
      • sort:SQL的sort(-1表示倒排,1表示顺序
      • max和min
    • 连接相关
      • close
      • maxTimeMS
    • 其他
      • pretty:提高可读性
      • forEach、next、hashNext
  • image-20220424163553449
  • image-20220424163725470
  • image-20220424163633173
管道聚合框架
  • 聚合框架(Aggregation Framework)是用于在一个或几个集合上进行的一系列运算从而得到期望的数据集的运算框架。主要有管道聚合map-reduce单一目的聚合
  • 下面主要介绍管道聚合
  • 管道(PipeLine):管道是聚合框架对数据进行处理的过程,和操作系统的管道类似(单向、流、保存在内存中)
  • 构件:筛选($filter)、投射($project)、 分组($group)、 排序($sort)、 限制($limit)和跳过($skip)、过滤($match )、连接运算($lookup)、展开、图搜索($graphLookup)、分面搜索($facet/$bucket )、运算的子运算等。
    • 连接运算只支持左外连接
    • 子运算
      • image-20220421212304338
  • 步骤(Stage):步骤是管道中数据流动的一系列操作,就是执行的构件;
#
db.<collectionName>.aggregate({stage},……)


#下面是管道的两步操作
db.test1.aggregate([
    { 
    	$match: { status: "A" } 
    }, #stage1
    { 
    	$group: { 
    		_id: "$cust_id", 
    		total: { $sum: "$amount" } 
    		} 
    }#stage2
])

使用

  • 下面主要基于SpringBoot整合MongoDB
SpringBoot-mongo基础
<!---mongodb相关依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
mongodb:
	host: localhost 
	port: 27017
	database: 数据库名
	username: XXX
	password: xxx
	authentication-database:  认证的权限
  • 实体类:
    • @Document:标记实体类
    • @MongoId:标记主键
    • @Field:标记为属性(如果属性名和数据库不同需要指定)
    • @Transient:标记属性不作为数据库的属性
    • @DBRef:标记属性位一个document对象
    • @Indexed:标记为该key设置索引
    • @CompoundIndex:联合索引
    • @CompoundIndexes:多个联合索引
  • 通过MongoTemplate进行操作常用的类
    • 查询:Query类
      • 如果文件很大需要允许使用磁盘:query.allowDiskUse(true);
    • 条件:BasicDBObject、Criteria
    • Update:更新类(拼接数据)
    • DeleteResult、UpdateResult:删除结果、更新结果

例子

https://www.cnblogs.com/luoxiao1104/p/15145686.html

    
//实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@CompoundIndexes(
        {
                @CompoundIndex(def = "{name:1,clazz:1,age:-1}")//联合索引
        }
)
@Document("test")
public class StudentEntity {
    @MongoId
    //@Indexed(unique = true,name = "_id"):默认主键就是唯一索引
    private Long id;
    private String name;
    @Field("class")
    @Indexed(name = "class_text")//普通索引
    private String clazz;
    private Integer age;
    private String[] hobby;
    private Date dateTime;
    @Transient
    private String other;
}


//使用
public void updateUser(){
        //根据id查询数据
        User user = mongoTemplate.findById("611a1cf8d5ba747098ff4625", User.class);
        //设置修改的值
        user.setName("lisi");
        user.setAge(18);
        //调用方法实现修改操作
        Query query = new Query(Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name",user.getName());
        update.set("age",user.getAge());
        UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
        long count = upsert.getModifiedCount();
        System.out.println(count);
    }
MongoDbTemplate
  • 可选配置(主要涉及事务和分布式:事务处理机制、读写关注、ack机制、读依赖、写检查)

    • image-20220428111540186
    • 事务:sessionSyncronization
      • image-20220428111938767
    • 读写关注
      • WriteConcern、ReadConcern
    • 读依赖:ReadPreference
    • ack机制:entityCallBack
    • 写检查:WriteResultChecking,有严格检查(报异常)和不检查
  • 使用

    • 增:insertsave

      • image-20220428112853606image-20220428114820069

      • //MongoTemplate studydb;
        
        //既可以通过集合也可以通过实体类插入
        	//以实体类为例子:实体类:StudentEntity,集合名:test4
        studydb.insert(new StudentEntity(),"test");
        
      • 修改:可以只改一个或者修改多个(First\Multi);可以是update(modify)或者replace

        • update和modify:用于部分字段更新
        • repalce:覆盖
      • image-20220428114531870 image-20220428121457361
      • image-20220428120911842
      • //以只更新一个为例子
        	//Query:查询更新的文档;BasicUpdate:更新的内容;document更新的文档(key-value形式)
        	//Class:更新文档参考字段名(即key的字段名),不指定则参考集合的字段名;
        	//String:集合名
        studydb.updateFirst(new Query(), new BasicUpdate(document),StudentEntity.class,"test");
        
        studydb.findAndModify(new Query(), new Update(), 
                              new FindAndModifyOptions(), StudentEntity.class,"test");
        
        //覆盖
        studydb.findAndReplace(new Query(), new StudentEntity(),
                               	new FindAndReplaceOptions(),StudentEntity.class,"test");
        
      • 删除:主要是删除多个或者删除一个;只有remove没有delete

      • image-20220428120213974
      •     //删除多个
            studydb.remove(new Query(),StudentEntity.class,"test");
            //删除一个
            studydb.remove(new Query(),"test");
            //删除多个
            studydb.findAllAndRemove(new Query(),StudentEntity.class,"test");
            //删除一个
            studydb.findAndRemove(new Query(),StudentEntity.class,"test");
        
      • image-20220428121855262 image-20220428121925923 image-20220428121954035
      • //
        studydb.find(new Query(),StudentEntity.class,"test");
        //fieldName:去重的字段;List:结果集
        studydb.findDistinct(new Query(),"fieldName","test",StudentEntity.class, List.class);
        
  • 聚合函数

  • 管道操作

    • agreegate:

    • image-20220428122906275
    • //TypedAggregation:聚合操作
      studydb.aggregate( TypedAggregation.newAggregation(Aggregation.match(Criteria.where("a").gt("11"))),
                        "test",
                     StudentEntity.class);
      
Criteria
  • 用于创建查询的中心类。它遵循流畅的API风格,因此您可以轻松地将多个条件链接在一起。标准的静态导入。这种方法提高了可读性。

  • 简单来说就是专门处理条件的类,一般通过静态方法直接创建;

  • 包含前面提到的几乎所有查询:例如

    •     //爱好必须为"睡觉", "吃饭",且顺序一致;
        	//Criteria.where("hobby").all("睡觉", "吃饭").size(2);爱好是吃饭睡觉,顺序不要求
        		final Criteria hobby = Criteria.where("hobby").is(new String[]{"睡觉", "吃饭"});
          final Criteria criteria = new Criteria();//用于组合条件
          final Criteria age = new Criteria("age").lt(22).gt(5);//年龄6-21
          final List<StudentEntity> studentEntities = mongoTemplate.find(
              new Query(criteria.andOperator(age,new Criteria().orOperator
                                             (hobby,Criteria.where("name").is("zhangsan3")))), StudentEntity.class, "test4");
      
Query

image-20220428122653998

Aggregation
  • SpringBoot提供了:Aggregation和TypeAggregation、AggregationUpdate处理聚合条件,
    • TypeAggregation对指定集合聚合输出指定的实体类型
    • Aggregation:通用的聚合类(另外两个都是其子类)
    • AggregationUpdate:显然是用于update

重点

索引

  • MongoDB能快速查找到主要原因是其强大的索引机制:
  • image-20220421210244432
  • 除了和关系数据库类似的:单字段索引、复合索引(同样有最左匹配原则)、hash索引、
  • Hash索引(散列索引):散列索引是指按照某个字段的散列值来建立索引;
  • 多键值索引(数组索引):主要是key对应的value是数组的情况
  • 过期索引:会过期的索引,在索引过期之后,索引对应的数据会被删除
  • 全文索引MongoDB会自动对索引的Field的数据进行分词,极大加快查找速度(不支持中文分词)
  • 地理空间索引:
    • 2d索引:可以用来存储和查找平面上的点
    • 2d sphere索引:可以用来存储和查找球面上的点。

文本搜索

  • 文本搜索显然是MongoDB的亮点之一,

    • 基于正则表达式的全文搜索:range
    • 基于全文索引的$text
  • 进行文本搜索,首先需要在文本搜索的Field建立索引

  • 和ES类似,MongoDB的文本搜索也是一个赋分的制度,分值越高说明匹配度越高;

  • $$text、$search、score、$meta$:是核心关键字

    • #简单的搜索
      db.<collectionName>.find({$text:{$search:"Jon"}})
      
      #多关键词搜索,注意这种搜索是 or的关系,有index 或者 有 operator都可以,所以,这个搜索会出来 Jon Snow,Jon Bon Jovi, Don Jon 等好多名字,而且 Jon Snow还不一定能出现在第一个
      db.<collectionName>.find({$text:{$search:"Jon Snow"}})
      
      #有Jon 但是没有Don的
      db.<collectionName>.find({$text:{$search:"Jon -Don"}})
      
      #搜索包含Jon Snow的词组。用这个搜索,我发现就出不来了。 因为我们的库里面的词组是Jon Aegon Snow
      db.<collectionName>.find({$text:{$search:"\"Jon Snow\""}})
      
      #加了下评分权重的排序。
      db.<collectionName>.find( {$text:{$search:"Jon Snow"}}, {score:{$meta:"textScore"}} ).sort({score:{$meta:"textScore"}})
      
      #使用两个短语,这就是一个逻辑上的AND关系,完美。假如你要使用mongodb 多个字符串匹配的查询,就用这个。不过,据说对中文分词不行。
      db.<collectionName>.find({$text:{$search:"\"Jon\"\"Snow\""}})
      

视图

  • 和关系数据库一样,MongoDB的视图也是为了方便对查找进行权限控制

  • MongoDB的视图支持:查找、统计、管道操作

    • #视图创建
      db.createCollection()
      db.createView()
      
      #查找
      db.collection.find()
      db.collection.findOne()
      #聚合操作
      db.collection.aggregate()
      #统计操作
      db.collection.countDocuments()
      db.collection.estimatedDocumentCount()
      db.collection.count()
      #去重
      db.collectionName.distinct()
      
      #删除视图
      db.collectionName.drop() 
      

聚合

  • 聚合操作处理数据记录和 return 计算结果。聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。
  • MongoDB 提供了三种执行聚合的方法:聚合管道map-reduce function单一目的聚合方法
    • 管道聚合:前面已经介绍过
    • 映射规约(map-reduce):映射规约是大数据处理的一种基本思想;
      • Map-reduce 使用自定义 JavaScript 函数来执行 map 和 reduce操作,以及可选的 finalize 操作。
      • map-reduce 操作有两个阶段:
        • map 阶段:它处理每个文档并为每个输入文档发出一个或多个对象
        • reduce阶段:将map操作的输出组合在一起
      • image-20220423152108290
    • 单一目的聚合
      • MongoDB 还提供 db.collection.estimatedDocumentCount(), db.collection.count()和db.collection.distinct()进行简单的聚合操作(统计和去重
      • image-20220423152202224

事务

image-20220422160105825

复杂的查询

数组和嵌套文档

数组

  • { : { : , … } }

  • # fruits和aminal都是数组
    db.test2.insertMany(
        [
            {"name":"lili","age":19,"fruits":["apple","banana"],"aminal":["cat","dog"]},
    		……
        ]
    )
    
    # {<array field> : { <operator1>: <value1>, ... } }
    db.test2.find( { fruits: ["apple", "banana"], aminal: { $all: ["cat", "dog"] } )
    	# fruits只包含两个元素"apple","banana"并且按顺序的数组
    	# $all:表示只要包含"cat"和"dog",不需要知道是否包含其他和顺序 
    
    #可以通过下标指定元素(下标由0开始);
    db.test2.find( { fruits.1: "apple"} )
    	#指定fruits第二个元素必须为apple
    	
    # $elemMatch:对元素进行多条件查询
    	#数组中最少一个元素同时满足所有的查询条件。
    db.test2.find( { age: { $elemMatch: { $gt: 22, $lt: 30 } } } )
    	#数组存在一个元素大于22且小于30
    
    # $size:元素的个数
    db.test2.find( { fruits: { $size: 3 } } )
    	#fruits有三个元素的文档 
    

嵌套文档

  • { : { : }, … }
  • 和数组基本一致,不过嵌套文档嵌套的数据可以比较复杂;
    • 需要子文档属性的顺序
      • 对嵌套文档整体做等值匹配的时候,要求的是对指定文档的精确匹配,包含字段顺序
    • 可以像数组一样指定字段
      • 例如``likes.amnimal`:指定为嵌套文档的amniamal字段
db.test2.insertMany(
    [
        {"name":"liyi","age":20,"likes":{{"fruits":["watermalon","banana"]},{"aminal":["panda","mouse"]}}},
         ……
    ]
)

#由于等值查询,必须对查询的fruits、aminal和likes保存的顺序一致
db.inventory.find( { likes: { fruits: [], aminal:[] } } )

#指定likes的fruilts的第二个元素
db.test2.find( { likes.fruits.1: "apple"} )

集合框架搜索

  • 支持运算符

    • $match:滤波操作(相当于where)

    • $project:投影操作(相当于SELECT xxx)

    • $group: 相当于group by

    • $sort: 相当于order by

    • $limit和$skip: 相当于limit

    • $lookup: 左连接

    • $graphLookup图连接

      • {
        $lookup: {
                    from: "xxx", #连接的外部表
                    localField: "xx", #外部表和本表连接的键
                    foreignField: "xx", #外键
                    as: ""#连接的外部表的属性的别名
                 }
        }
        
        {
           $graphLookup: {
              from: <collection>,
              startWith: <expression>,
              connectFromField: <string>,
              connectToField: <string>,
              as: <string>,
              maxDepth: <number>,
              depthField: <string>,
              restrictSearchWithMatch: <document>
           }
        }
        
    • $unwind:拆分数组

      • //原数据
        {
            "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
            "name" : "鲁迅",
            "books" : [ 
                {
                    "name" : "呐喊",
                    "publisher" : "花城出版社"
                }, 
                {
                    "name" : "彷徨",
                    "publisher" : "南海出版出"
                }
            ]
        }
        //拆分  db.xxxxx.aggregate({$unwind:"$books"})
        {
            "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
            "name" : "鲁迅",
            "books" : {
                "name" : "呐喊",
                "publisher" : "花城出版社"
            }
        }
        {
            "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
            "name" : "鲁迅",
            "books" : {
                "name" : "彷徨",
                "publisher" : "南海出版出"
            }
        }
        
  • db..aggregate([{管道操作}])

文本查询(文本搜索)

  • 视图不支持文本搜索。

  • 前面已经介绍过使用(在有文本所有的field中)

    • $test+$search:进行文本搜搜
    • score+$meta:进行匹配度排序
  • 聚合框架下的文本查询的限制

    • $text的$search必须在聚合的第一个Stage

    • 只能有一次$search

    • 如果需要按照分数排序需要在后面的Stage中进行(默认不会排序)

    • db.test.aggregate(
         [
             { $match: { $text: { $search: "cake tea" } } },  #第一阶段进行search
             { $project: { title: 1, _id: 0, score: { $meta: "textScore" } } },#需要排序,必须自己排序
             { $match: { score: { $gt: 1.0 } } }
         ]
      )
      

地理空间查询

  • 待学习

集合

  • MongoDB的集合类似MySQL的表(关系模型),类似redis的hash表,在MongoDB中,几乎一切数据都是通过集合组织起来的
  • 在MongoDB中集合有俩种类型:固定集合和动态分配集合动态分配集合又可以分为:有约束和没有约束(即校验器校验)
  • capped collection:固定集合,顾名思义,就是大小、存储文档数量固定的集合;在固定集合中:
    • 循环覆盖:没有足够空间时,最老的文档会被删除以释放空间,新插入的文档会占据这块空间。
    • 不能更改无法将固定集合转换为非固定集合,也不能修改固定集合容量和可存最大文档数据
    • 有序自然顺序就是文档的插入顺序,可以指定由就到新或者相反;
  • 动态分配集合:就是一般的集合,没有固定的大小,由hash节点的node记录相关信息;

索引机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计数排序的实现

计数排序是非比较排序的一种&#xff0c;是对哈希直接定址法的变形应用&#xff0c;其操作步骤如下&#xff1a; 1.统计相同元素出现的次数。 2.根据统计结果将序列回收到原来的序列中。 拿一组重复元素较多的数组来举例子&#xff1a; 10 11 10 15 14 15…

Disruptor-源码解读

前言 Disruptor的高性能&#xff0c;是多种技术结合以及本身架构的结果。本文主要讲源码&#xff0c;涉及到的相关知识点需要读者自行去了解&#xff0c;以下列出&#xff1a; 锁和CAS伪共享和缓存行volatile和内存屏障 原理 此节结合demo来看更容易理解&#xff1a;传送门…

数云融合|新手入门,5分钟秒懂开源

目录一、开源软件开源领域的两大组织&#xff1a;FSF和OSI二、开源许可证开源意味着免费吗&#xff1f;三、开源技术应用领域四、总结一、开源软件 开源即开放源代码&#xff0c;他的核心是源代码公开&#xff0c;任何人都可以查看、使用、修改和分发。与之相对的是闭源&#…

js排序算法

排序算法 - jsjs交换两个值的三种方法方式1&#xff1a;算术运算方式2&#xff1a;ES6解构方式3&#xff1a;数组的特性冒泡排序实现思路图解bubbleSort参考视频选择排序实现思路图解selectionSort参考视频插入排序实现思路图解insertionSort参考视频js交换两个值的三种方法 方…

javaSccript---call()、 bind()、 apply()的区别

call()、apply()、bind() 都是用来重定义 this 这个对象的 语法&#xff1a; function.apply(thisArg, [argsArray])//argsArray 是一个可选的数组 function.call(thisArg, arg1, arg2, ...)//arg1、arg2、... 是将传递给函数的参数列表 function.bind(thisArg, arg1, arg2, ..…

Webstorm是什么软件?你了解吗

WebStorm 是一款由 JetBrains 开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它是专门为开发 Web 应用程序而设计的。它提供了许多功能&#xff0c;例如代码自动完成、错误突出显示、重构、调试、版本控制等&#xff0c;可以帮助开发人员提高效率和代码质量。WebS…

Vector 高性能日志收集工具

文章目录Vector 简介相关概念事件Data modelEvent typesLog eventsMetric eventsTraces组件构成源转换接收器PipelineBuffersBackpressureRolesAgentDaemonSidecarAggregatorTopology分布式集中式基于流Vector 简介 Vector 是一种高性能的可观察性数据管道&#xff0c;可让组织…

天梯赛练习集-L1-031到L1-040–python - java

文章目录PythonL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以BL1-037 A除以BL1-038 新世界L1-039 古风排版L1-040 最佳情侣身高差JavaL1-031 到底是不是太胖了L1-032 Left-padL1-033 出生年L1-034 点赞L1-035 情人节L1-036 A乘以B…

ChatGPT入门必知必会

2023年是真正意义上的AI之年&#xff0c;因为ChatGPT 2007年&#xff0c;iPhone开启了智能手机时代&#xff0c;2023年&#xff0c;我们迎来了人工智能时代&#xff0c;我们正处于历史的大转折点上&#xff0c;这也许是启蒙运动级别的思想和社会转折&#xff0c;工业革命级别的…

5万元内最经济双卡4090深度学习方案

深度学习双卡4090攒机方案 znsoft 一枚快乐的炼丹师 AMD 7950x 双4090方案 不到5万&#xff0c;目前最经济的双卡人工智能服务器方案 主板&#xff1a; 华硕 x670EA 吹雪 3000元 CPU: amd 7950x 3500元 内存&#xff1a; 32G4 128G DDR5 800x4 3200元 机箱&#xff1a; 追…

【eMMC学习记录】emmc相关名词解释和基础概念

名词解释 NAND Flash:半导体闪存 HDD&#xff1a;机械硬盘 FW:固件 Peak Power:峰值功率 Active Power:读写功耗 Idle Power:空闲功耗 standby/sleep Power Dev Sleep Power:SSD内部休眠功耗 RAM:掉电丢失数据 FGT:浮栅晶体管 FormFactor:尺寸标准件 AFA:全闪存整列…

线段树之延迟数组_20230410

线段树 之 延迟数组 前言 线段树是一类特殊的完全二叉树&#xff0c;其本质是对递归过程信息的再处理和再记忆&#xff0c;线段树构造完成后&#xff0c;可以脱离原始数组或线性表&#xff0c;直接对线段树进行查询或更新操作即可。线段树的储存结构和堆结构类似&#xff0c;…

springboot——集成elasticsearch进行搜索并高亮关键词

目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮关键词 1.elasticsearch概述 &#xff08;1&#xff09;是什么&#xff1a; Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的…

软测界的黑科技,难道不来瞧瞧?

写在前面&#xff1a; 在当今互联网时代&#xff0c;软件已经渗透到了人们生活的方方面面&#xff0c;各种类型的软件应运而生&#xff0c;为人们的工作和生活提供了更便捷的服务。然而&#xff0c;随着软件的不断增长和复杂性的不断提高&#xff0c;软件测试变得越来越重要。…

字节跳动AI-LAB | 算法三轮技术面分享

作者 | 太蔡了整理 | NewBeeNLP面试锦囊之面经分享系列&#xff0c;持续更新中 可以后台回复"面试"加入交流讨论组噢写在前面楼主是C9末流渣硕一枚&#xff0c;现在已经正式确定offer要去我宇宙条了&#xff01;当时为了准备面试几乎把网上头条的面经翻了个底朝天&am…

php(phar)反序列化漏洞及各种绕过姿势

概念&#xff1a; 序列化其实就是将数据转化成一种可逆的数据结构&#xff0c;自然&#xff0c;逆向的过程就叫做反序列化。简单来说就是我在一个地方构造了一个类&#xff0c;但我要在另一个地方去使用它&#xff0c;那怎么传过去呢&#xff1f;于是就想到了序列化这种东西&a…

句柄泄露的分析思路

基础知识 问题 什么是句柄&#xff1f; 句柄(file descriptor)即文件描述符&#xff0c;简称fd。Linux 系统中&#xff0c;把一切设备都视作文件&#xff0c;当进程打开现有文件或创建新文件时&#xff0c;内核向进程返回一个文件描述符。 FD作为文件句柄的实例&#xff0c;…

Nacos安装配置

一、下载Nacos Server。 通过Release页面进行下载&#xff0c;这里我以windows版本为例。 二、修改Nacos Server配置文件。 下载完成后&#xff0c;解压安装包后得到如下文件夹 为了配置集群&#xff0c;将nacos-server复制相同的两份&#xff0c;分别为命名为nacos-clust…

Java中有了equals(),为什么还有“==“

背景&#xff1a;Java中“一切皆是对象”&#xff0c;为什么还有非对象的“”&#xff1f; 在Java语言假设我们只进行OOP&#xff0c;所以Java代码都是由一个接着一个的类组成的。那么&#xff0c;对象之间比较&#xff0c;用equals()就可以了。 可为什么“”在代码随处可见呢…

海尔智家业绩尚可,但其智能家居“全场景”没做起来

‍数据智能产业创新服务媒体——聚焦数智 改变商业近日&#xff0c;海尔智家发布了其2022年年报&#xff0c;数据显示&#xff0c;2022年海尔智家实现收入2435.14亿元&#xff0c;同比增长7.2%&#xff1b;扣非归母净利润139.63亿元&#xff0c;同比增长18%&#xff0c;利润增…