mongodb(一):MongoDB入门以及基本的CRUD语句

1. MongoDB相关了解

1.1 简介

  1. MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种;
  2. 支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活;
  3. MongoDB中的记录是一个文档,它是一个由字段和值对(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组。

1.1 应用场景

传统的关系型数据库(eg:mysql),在应对“三高”需求面前显得力不从心。
解释说明三高:

  1. 对数据库的高并发读写
  2. 对海量数据的高效率存储和访问
  3. 对数据库的高可扩展性和高可用性

具体应用场景举例:

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

1.2 什么时候选择mongoDB

  1. 数据量大
  2. 读写操作比较频繁
  3. 数据价值较低,对事务性要求不高
  4. 不需要复杂的join支持
  5. 应用需要2000-3000以上的读写QPS
  6. 需要TB甚至 PB 级别数据存储

1.3 结构型数据库和Mongodb对比

结构型数据库MongoDB说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
indexindex索引
join----表连接,mongodb不支持($lookup似乎可以实现,个人没有了解过)

2. 相关基本操作

2.1 数据库相关

2.1.1 查看有权限查看的所有的数据库命令

show dbs;

2.1.2 选择或创建数据库

如果articledb不存在,则将自动创建该数据库

use articledb;

注意:

  1. 在mongodb中,集合只有在文档内容插入后才会真正创建!
  2. 有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
    (1) admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限;
    (2) local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合;
    (3) config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

2.1.2 数据库的删除

#数据库删除
db.dropDatabase()

2.2 文档插入

如果插入时集合不存在,则会隐式地自动创建该集合。
格式:

db.collection.insert( 
   <document or array of documents>,
   { 
      writeConcern: <document>, 
      ordered: <boolean> 
    }
)

2.2.1 单条插入

举例:

db.comment.insert(
    {
        "articleid": "100000",
        "content": "今天天气真好,阳光明 媚",
        "userid": "1001",
        "nickname": "Rose",
        "createdatetime": new Date(),
        "likenum": NumberInt(10),
        "state": null
    }
)

注意:

  1. mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题
  2. 插入当前日期使用 new Date()
  3. 插入的数据没有指定 _id ,会自动生成主键值
  4. 如果某字段没值,可以赋值为null,或不写该字段
  5. 文档中的键/值对是有序的

2.2.2 批量插入

db.comment.insertMany(
    [
        {
            "_id": "1",
            "articleid": "100001",
            "content": "我们不应该把清晨浪费在手机上,健康很重要,一杯温水幸福你我 他。",
            "userid": "1002",
            "nickname": "相忘于江湖",
            "createdatetime": new Date("2019-08- 05T22:08:15.522Z"),
            "likenum": NumberInt(1000),
            "state": "1"
        },
        {
            "_id": "2",
            "articleid": "100001",
            "content": "我夏天空腹喝凉开水,冬天喝温开水",
            "userid": "1005",
            "nickname": "伊人憔 悴",
            "createdatetime": new Date("2019-08-05T23:58:51.485Z"),
            "likenum": NumberInt(888),
            "state": "1"
        }
    ]
);

2.3 文档查询

基本格式:

db.collection.find(<query>, [projection])
queryprojection
可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档( {} )可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,请省略此参数。

2.3.1 普通查询

查询comment集合中的articleid="100000"的文档,并只显示_id、userid、nickname、articleid字段

#查询。显示指定字段
db.comment.find(
    {
        articleid: "100000"
    },
    {
        _id: 1,
        userid: 1,
        nickname: 1,
		articleid: 1
    }
);

2.3.2 分页查询

  1. 统计查询count()
    统计userid = "1003"的文档个数,不写条件则为统计所有
db.comment.count({
    "userid": "1003"
})
  1. 分页列表查询
    使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据
db.collection.find().limit(NUMBER).skip(NUMBER)

举例:

页长为3进行分页显示

//第一页
db.comment.find().skip(0).limit(3)
//第二页
db.comment.find().skip(3).limit(3)

2.3.3 排序查询

sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。

db.collection.find().sort({KEY:1})

举例:
对userid降序排列、对访问量升序排列

db.comment.find().sort({
    userid: 1,
    likenum:  - 1
})

2.3.4 正则查询

格式:

db.collection.find({field:/正则表达式/})

举例:
查询评论内容包含“开水”的所有文档

db.comment.find({
    content: /开水/
})

查询评论的内容中以“专家”开头

db.comment.find({
    content: /^专家/
})

2.3.5 比较查询$gte

格式:

db.集合名称.find({ "field" : { $gte: value }})

举例:

db.comment.find({
    likenum: {
        $gt: NumberInt(700)
    }
})

2.3.6 包含查询$in、$nin

查询userid等于1002或1003的文档

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

查询userid不等于1002或1003的文档

db.comment.find({
    userid: {
        $nin: ["1002", "1003"]
    }
})

2.3.7 条件连接查询$and、$or

查询likenum>=1000&&likenum<=2000&&state = "1"的文档

db.comment.find({
    $and: [
        {
            likenum: {
                $gte: 1000
            }
        },
        {
            likenum: {
                $lte: 2000
            }
        },
        {
            state: "1"
        }
    ]
})

查询likenum=2000 || content like %开水%的

db.comment.find({
    $or: [
        {
            likenum: 2000
        },
        {
            content: /开水/
        }
    ]
})

2.4 文档更新

基本格式:

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

2.4.1 覆盖更新

覆盖整个文档更新。更comment集合中_id = ObjectId(“61a04d755d5900001f003637”)的文档

#更新指定文档,会覆盖整个文档
db.comment.update(
    {
        _id: ObjectId("61a04d755d5900001f003637")
    },
    {
        nickname: "qushuai"
    }
);

2.4.2 非覆盖更新(一条)

更新第一条,只更新指定字段。更comment集合中_id = "1"的文档,并只更新nickname字段

db.comment.update(
    {
        _id: "1"
    },
    {
        $set: {
            nickname: "叱咤风云"
        }
    }
);

2.4.3 非覆盖更新(all)

更新所有匹配的文档

db.comment.update(
    {
        userid: "1003"
    },
    {
        $set: {
            nickname: "吴京2"
        }
    },
    {
        multi: true
    }
)

2.4.4 $inc增长

db.comment.update(
    {
        userid: "1003"
    },
    {
        $inc: {
            likenum: NumberInt(1)
        }
    },
    {
        multi: true
    }
)

2.7 文档删除

  1. 删除comment文档中userid = "1003"的文档
db.comment.remove(
    {
        userid: "1003"
    }
)
  1. 删除comment文档中的全部数据
db.comment.remove({})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值