zoukankan      html  css  js  c++  java
  • 【Mongodb】Mongodb QuickStart

    Mongodb QuickStart

    Mongodb 概念

    Mongodb是开源,高性能,无模式的文档型数据库。属于NoSql非关系型数据库。
    它支持的数据结构非常松散,是一种类似于JSON的格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活。

    适用场景:

    1)社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
    2)游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
    3)物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将
    订单所有的变更读取出来。
    4)物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
    5)视频直播,使用 MongoDB 存储用户信息、点赞互动信息等
    

    mongodb中主要包含以下概念:

    • database: 数据库
    • collection: 集合 多个document的合集 (可以理解成mysql中的表)
    • document: 文档,(可以理解成mysql中的一行数据)
    • field: 字段 (可以理解成mysql 中的列名)
    • value: 值 (可以理解成mysql中的列值)
    SQL术语/概念 MongoDB术语/概念 备注
    database database 数据库
    table collection 数据库表/集合
    row document 数据记录行/文档
    column field 数据字段/域
    index index 索引
    table joins 表连接,MongoDB不支持
    嵌入文档 MongoDB通过嵌入式文档来替代多表连接
    primary key primary key 主键,MongoDB自动将_id字段设置为主键
    BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持
    内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
    

    mongodb 特点

    (1)高性能:MongoDB提供高性能的数据持久性。特别是,对嵌入式数据模型的支持减少了数据库系统上的I/O活动。索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。(文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求、地理位置索引可用于构建各种 O2O 应用)mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求。Gridfs解决文件存储的需求。
    (2)高可用性:MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余。
    (3)高扩展性:MongoDB提供了水平可扩展性作为其核心功能的一部分。分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展)从3.4开始,MongoDB支持基于片键创建数据区域。一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。
    (4)丰富的查询支持:MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
    (5)其他特点:如无模式(动态模式)、灵活的文档模型、

    安装

    ubuntu 的安装
    https://blog.csdn.net/fhjdzkp/article/details/104360231

    常用命令

    前提:
    假设有存放博客园文章评论的数据存到mongoDB中,数据结构如下
    db: article
    专栏文章评论 comment

    字段名称 字段含义 字段类型 备注
    _id ID ObjectId或String Mongo的主键的字段
    articleid 文章ID String
    content 评论内容 String
    userid 评论人ID String
    nickname 评论人昵称 String
    createdatetime 评论的日期时间 Date
    likenum 点赞数 Int32
    replynum 回复数 Int32
    state 状态 String 0:不可见;1:可见;
    repparentidlynum 上级ID String 如果为0表示文章的顶级评论

    数据库操作

    use database
    

    如果数据库存在则切换到对应的数据库,不存在则创建

    db
    

    可以查看当前在哪个数据库下

    • 查看所有数据库
    show dbs
    show database
    
    • 删除数据库
    // 先切换到对应数据库
    use database;
    db.dropDatabase(); // 删除数据库
    

    集合操作

    // 创建集合,显示创建
    db.createCollection(集合名字);
    // 查看当前库中的表
    show collections
    show tables
    
    • 集合的命名规则
    集合的命名规范:
    集合名不能是空字符串""。
    集合名不能含有字符(空字符),这个字符表示集合名的结尾。
    集合名不能以"system."开头,这是为系统集合保留的前缀。
    用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除
    非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
    
    • 集合删除
    db.集合名.drop();
    

    Document 基本CRUD

    文档创建

    db.集合名.insert()
    

    db.comment.insert({
    	"articleid": "200000",
    	"content": "happy 天气好好",
    	"userid": "1000",
    	"nickname": "amber",
    	"createdatetime": new Date(),
    	"likenum": NumberInt(10),
    	"state": null
    })
    

    Tips:
    提示:
    1)comment集合如果不存在,则会隐式创建
    2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字)
    3)插入当前日期使用 new Date()
    4)插入的数据没有指定 _id ,会自动生成主键值
    5)如果某字段没值,可以赋值为null,或不写该字段。

    批量插入
    db.collection.insertMany([ < document 1 > , < document 2 > , ...], {
    	writeConcern: < document > ,
    	ordered: < boolean >
    })
    

    文档查看

    1. 查看所有文档
      db.collection.find(, [projection])
    参数 类型 备注
    query Document 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档
    projection document 可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,请省略此参数。
    db.comment.find()
    
    1. 查看指定文档
    db.comment.find({"nickname":"amber"})
    

    查询结果

    {
    	"_id": ObjectId("5eef026e3c7322faaad75097"),
    	"articleid": "200000",
    	"content": "今天天气真好,阳光明媚",
    	"userid": "00786",
    	"nickname": "amber",
    	"createdatetime": ISODate("2020-06-21T06:47:10.437Z"),
    	"likenum": 10,
    	"state": null
    }
    
    1. 投影查询(Projection Query)如果只想显示nickname那一列
    db.comment.find({"nickname":"amber"}, {nickname: 1, _id: 0})
    

    Result:

    { "nickname" : "amber" }
    
    1. 查找符合条件的第一条
    db.comment.findOne({userid:'00786'})
    
    文档分页

    查询计数
    语法:

    db.collection.count(query, options)
    

    查询所有计数

    db.comment.count()
    

    指定查询计数

    db.comment.count({userid: "1000"})
    

    返回前3条数据

    db.comment.find().limit(3)
    

    查询滴3条和第四条记录,ship表示跳过前面几条

    db.comment.find().limit(2).skip(2)
    
    排序查询

    语法

    db.集合名称.find().sort(排序方式)
    

    db.comment.find().sort({_id: -1})
    
    正则的复杂条件查询
    db.集合.find({字段:/正则表达式/})
    

    db.comment.find({userid: /00/});
    
    比较查询
    db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
    db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
    db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
    db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
    db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
    
    包含查询

    包含

    db.comment.find({userid:{$in:["1001","1004"]}})
    

    不包含

    db.comment.find({userid:{$nin:["1001","1004"]}})
    
    满足多个条件查询
    db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})
    

    文档的更新

    语法

    db.collection.update(query, update, options)
    或者
    db.collection.update( < query > , < update > , {
    			upsert: < boolean > ,
    			multi: < boolean > ,
    			writeConcern: < document > ,
    			collation: < document > ,
    			arrayFilters: [ < filterdocument1 > , ...],
    			hint: < document | string > // Available starting in MongoDB 4.2 } )
    

    参数说明

    参数 类型 备注
    query Document 查询条件
    update Document 更新后的结果
    upsert boolean 可选。为true,没有与查询条件匹配的文档时创建默认值为false
    multi boolean 可选。为true,则更新符合查询条件的多个文档。如果设置为false,则更新一个文档。默认值为false
    writeConcern document 可选。表示写问题的文档。抛出异常的级别。
    collation document 可选,用于校对规则
    arrayFilters array 可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素
    hint Documentor string 可选。指定用于支持查询谓词的索引的文档或字符串。该选项可以采用索引规范文档或索引名称字符串
    • 覆盖修改
    db.comment.update({userid:"1000"},{nickName: "xixi"})
    

    执行后,我们会发现,这条文档除了nickName字段其它字段都不见了,

    • 局部修改
      再次插入
    db.comment.insert({
    	"articleid": "200000",
    	"content": "happy 天气好好",
    	"userid": "1000",
    	"nickname": "amber",
    	"createdatetime": new Date(),
    	"likenum": NumberInt(10),
    	"state": null
    })
    

    执行局部修改

    db.comment.update({userid:"1000"},{$set: {nickName: "haha"}})
    
    • 批量的修改
    db.comment.update({userid:"1000"},{$set: {nickName: "haha"}}, { multi: true})
    
    文档删除
    db.集合名.remove()
    

    如 删除全部

    db.comment.remove({})
    

    删除指定

    db.comment.remove({_id:指定的id})
    

    常用命令

    选择切换数据库:use articledb 
    插入数据:db.comment.insert({bson数据}) 
    查询所有数据:db.comment.find(); 
    条件查询数据:db.comment.find({条件}) 
    查询符合条件的第一条记录:db.comment.findOne({条件}) 
    查询符合条件的前几条记录:db.comment.find({条件}).limit(条数) 
    查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数) 
    修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:{要修改部分的字段:数据})
    修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}}) 
    删除数据:db.comment.remove({条件})
    统计查询:db.comment.count({条件})
    模糊查询:db.comment.find({字段名:/正则表达式/})
    条件比较运算:db.comment.find({字段名:{$gt:值}})
    包含查询:db.comment.find({字段名:{$in:[值1,值2]}})或db.comment.find({字段名:{$nin:[值1,值2]}})
    条件连接查询:db.comment.find({$and:[{条件1},{条件2}]})或db.comment.find({$or:[{条件1},{条件2}]})
    

    索引

    索引类型

    1. 单索引
      单个字段的索引
    2. 符合索引
      多个字段组成的索引
    3. 其他索引
      地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)。

    创建索引

    MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)

    db.collection.createIndex(keys, options)
    

    包含字段和值对的文档,其中字段是索引键,值描述该字段的索引类型。对于字段上的升序索引,请指定值1;对于降序索引,请指定值-1。比如: {字段:1或-1} ,其中1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 即可。

    db.comment.createIndex({userid:1})
    

    查看索引

    db.集合名.getIndexes()
    db.comment.getIndexes()
    

    删除索引

    db.集合名.dropIndex(index)
    
    db.集合名.dropIndex(索引名称)
    或者
    db.集合名.dropIndex({userid:1})
    

    删除所有索引

    db.collection.dropIndexes()
    

    索引的使用

    db.collection.find(query,options).explain(options)
    

    db.comment.find({userid:"1001"}).explain()
    
  • 相关阅读:
    全屏后无法检查键值
    根据秒转化为周天时秒分,不足补0
    日期时间格式化(Date对象)
    AS3 RGB颜色
    Egret eui中eui.ItemRenderer类型的组件在渲染界面时,dataChanged()重复调用
    egret 画圆 画圆角矩形 画矩形
    egert 缓动
    Flashdeveloper开多个实例进程解决方案
    flash 发布exe文件
    sublime Text3 如何自动排版代码
  • 原文地址:https://www.cnblogs.com/amberbar/p/13171134.html
Copyright © 2011-2022 走看看