mongodb入门

MongoDB 是一款强大、灵话,且易于扩展的通用型数据库.它能扩展出作常多的功能,如级索引,范围查询,排序,聚合,以及地理空间索引。

  • 文档是 MogoDB 中数据的基本单元,非常类似于关系型数据库管理系统中的行, 但更具表现力
  • 类似地,集合(collection)可以看作是一个拥有动态模式的表 MongoDB 的一个实例可以拥有多个相互独立的数据库,每一个数据库都拥有自己的集合
  • 每一个文档都有一个特殊的键”_id”,这个键在文档所属的集合中是唯一的
  • MongoDB 白带了个简单但功能强大的 JavaScriptShell,可用与管理 MongoDB 的实例或数据操作

shell 中的基本操作

1. 创建(insert)
insert 函数可以将一个文档添加到集合中

1
2
post = { title: "hello", date: new Date() };
db.test.insert(post);

2. 读取(find 或 findOne)
find 和 findOne 都可以查询集合里的文档,
findOne 只查询一个文档。

1
2
db.test.find();
db.test.findOne();

3. 更新(update)
update 修改博客文章,至少接受两个参数
第一个:限定条件(用来匹配待更新的文档)
第二个:新的文档

1
2
3
// 为post增加一个字段
post.comments = [];
db.test.update({ title: "hello", post });

4. 删除(remove)
使用 remove 方法可以从数据库删除文档,如果没有使用任何参数,他会删除全部文档,如果接入一个限定条件的文档作为参数他会只删除限定条件的文档。

1
db.test.remove({ title: "hello" });

mongodb 中的基本数据类型

  • null
    null 用于表示空值或者不存在的字段
  • 布尔值
    布尔值有两个值 true 和 false

  • 数值
    数值可以表示浮点数也可表示整数,使用表示整数时,可以使用 NumberInt 或者 NumberLong 类表示

  • 字符串

  • 日期
    在创建日期时,应使用 new Date(),而不是 Date()。
    因为 new Date()返回的是一个时间对象,Date()返回的是一个字符串,如果不加以约束,后面管理会很混乱

  • 正则表达式

  • 数组
    mongodb 能分析深入其结构,对其内容做操作

  • 内嵌文档
    内嵌文档可以使数据组织更加自然

  • 对象 id
    在一个集合中,每个文档有唯一的:_id,确保集合中的每个文档都能被唯一标识

不常用:

  • 二进制数
  • 代码

使用 MongoDB Shell

  1. 可直接使用 mongo 执行 js 脚本,也可以使用 load 函数执行脚本
  2. 创建.mongorc.js,可用于被频繁加载的文件或者需要开始加载的文件

注意
‘.mongorc.js’在运行 shell 时所在的目录,也就是C:\Users\tfsmy(用户名)目录

创建更新和删除文档

  1. 批量插入 insertMany

    1
    db.test.insertMany({ _id: 0 }, { _id: 1 }, { _id: 2 });
  2. 有条件的删除 remove ,删除整个集合 drop

  3. 更新文档 update 如果同时更新,先到达服务器的先执行,接着执行另外一个。批量修改时需保持 key 唯一

  4. $修改器:原子性修改,修改某个特定的键值

    修改器选项

    • 增加和减少
      $set 用于修改一个键值

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      db.products.update(
      { _id: 100 },
      {
      $set: {
      quantity: 500,
      details: { model: "14Q3", make: "xyz" },
      tags: ["coats", "outerwear", "clothing"]
      }
      }
      );
      // 数组也可以
      db.products.update(
      { _id: 100 },
      {
      \$set: {
      "tags.1": "rain gear",
      "ratings.0.rating": 2
      }
      }
      );

      $unset 移除一个键值

      1
      2
      3
      4
      db.products.update(
      { sku: "unknown" },
      { $unset: { quantity: "", instock: "" } }
      );

      $inc 用于增加已有键的值,只能用来增加数值,值必须为数字
      使用场景:更新分析数据,因果关系,投票,或者其他有变化的数值

      1
      2
      3
      4
      5

      db.products.update(
      { sku: "abc123" },
      { $inc: { quantity: -2, "metrics.orders": 1 } }
      );
  • 数组修改器
    $push 向已有的数组末尾加入一个元素,要是没有就新建一个数组
    $pop 向已有的数组删除一个元素(val 值为正数则从末尾开始删除,val 为负数则从头部开始删除)
    $addToSet 向已有的数组末尾加入一个元素(但是可以避免重复),要是没有就新建一个数组,另外addToSet可以和$each结合实现添加不同的值

    1
    2
    3
    4
    5
    6
    7
    db.inventory.update({ _id: 1 }, { $addToSet: { tags: "camera" } });

    //批量增加无重复元素
    db.inventory.update(
    { _id: 2 },
    { $addToSet: { tags: { $each: ["camera", "electronics", "accessories"] } } }
    );

    $pull 可以根据具体的值删除数组中的元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //单条删除
    db.profiles.update({ _id: 1 }, { $pull: { votes: { $gte: 6 } } });

    //多条删除
    db.survey.update(
    {},
    { $pull: { results: { score: 8, item: "B" } } },
    { multi: true }
    );

    $ 数组定位修改
    如果数组中有多个值,我们想对其中一部分进行操作,就需要用到位置定位操作符,但是只修改第一个被查询到的数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //修改前
    db.students.insert([
    { _id: 1, grades: [85, 80, 80] },
    { _id: 2, grades: [88, 90, 92] },
    { _id: 3, grades: [85, 100, 90] }
    ]);
    // 把 id 为 1,greades 中第一个 80 的项做操作
    db.students.updateOne(
    { _id: 1, grades: 80 },
    { $set: { "grades.$" : 82 } }
    )

    // 结果
    { "_id" : 1, "grades" : [ 85, 82, 80 ] }
    { "_id" : 2, "grades" : [ 88, 90, 92 ] }
    { "_id" : 3, "grades" : [ 85, 100, 90 ] }

upsert
upsert 是一种特殊的更新,如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础新建一个新的文档,要实现这种功能,需要把 update 函数第三个参数设置为 true

1
2
3
4
5
// 找不到符合条件的文档
db.users.update({"rep":25},{"$inc":{"req":3}},true)

// 结果
{"_id":ObjectId("dsa65d86s8a6d86adsa"),"rep":28}

更新多个文档
上面的一些基本都是更新第一次查找的文档,如果要更新多个文档,只需要把 update 函数第四个参数设置为 true

写入安全机制

  • 响应式写入:写入成功后,数据库会给出响应
  • 非响应式写入:不返回任何响应