0%

0x01 MongoDB 练习手札

最近看 Node.js 相关的一些东西,跟着书上的教程实现了一个 Express + MongoDB + Vue.js 实验性项目,对于常年使用 LNMP 黄金搭档的我来说,不用写 SQL 语句真的是太爽了,也不用关心 MySQL 中的字段增减,真的是太幸福了。

既然学习就肯定要动手,不动手的学习就是耍流氓!说干就干!

MongoDB 的基本概念存入单元

  1. 数据库 databases
  2. 集合 collection
  3. 文档 document

正确的理解名词有助于我们在未来的开发和工作中方便和他人进行沟通,MongoDB 中可以存在多个数据,而数据库中可以存在多个集合,每个集合中可以存放多条文档数据。

希望大家通过练习来掌握基础 MongoDB 操作,别光看,动手敲! 别光看,动手敲! 别光看,动手敲!

  1. 进入 my_practices 数据库
1
use my_practices
  1. 查看数据库
1
show dbs
  1. 向数据库的 user 集合插入一个文档
1
// insertOne 增加语义化一些
2
// 在开发中,因为集合中存放了多个文档,所以集合命名我更加习惯用复数的形式
3
// 当然这种习惯性的东西不强制每个人,只是我的个人习惯
4
// 当然MongoDB查询的方法还有insert,insertMany,分别是什么可以感兴趣的可以查询文档。
5
db.users.insertOne({
6
  username: "Tom",
7
  age: 18,
8
  gender: "male"
9
});
  1. 查询 user 集合中的文档
1
// find中可以传递空文档{},也可以什么都不传,表示查询全部
2
db.users.find({});
  1. 向数据库的 user 集合中再插入一个文档
1
db.users.insertOne({
2
  username: "Jerry",
3
  age: 17,
4
  gender: "male"
5
});
  1. 查看当前数据库 user 集合中的文档
1
db.users.find({})
  1. 统计数据库 user 集合中的文档数量
1
db.users.find().count()
  1. 查询数据库 user 集合中 username 为 Tom 的文档
1
// 传递要查询文档中需要满足的条件
2
db.users.find({
3
  username: "Tom"
4
});
  1. 向数据库 user 集合中的 username 为 Tom 的文档,添加一个 address 属性,属性值为 Shenzhen.
1
// 修改指定文档对应的属性
2
db.users.update(
3
  {
4
    username: "Tom"
5
  },
6
  {
7
    $set: { address: "Shenzhen" }
8
  }
9
);
  1. 使用{username: ‘Herry’} 替换 username 为 Jerry 的文档
1
db.users.replaceOne(
2
  {
3
    username: "Jerry"
4
  },
5
  {
6
    username: "Herry"
7
  }
8
);
  1. 删除 username 为 Tom 的文档的 address 属性
1
// 删除指定文档对应的属性,为的是删除属性,所以属性对应的值可以随意
2
// 个人感觉值就是起了一个占位作用,美化语句而已
3
db.users.update(
4
  {
5
    username: "Tom"
6
  },
7
  {
8
    $unset: {
9
      address: ""
10
    }
11
  }
12
);
  1. 向 username 为 Tom 的文档中,添加一个 hobby:{cities: [‘BeiJing’, ‘ShangHai’], movies: [‘Hero’, ‘King’]}
1
// 修改之后,查询的时候我发现在一些GUI中,hobby的属性值被标记为Document
2
// 也就是说我们的hobby属性保存的是一个文档,这个文档叫做内嵌文档
3
db.users.update(
4
  {
5
    username: "Tom"
6
  },
7
  {
8
    $set: {
9
      hobby: {
10
        cities: ["BeiJing", "ShangHai"],
11
        movies: ["Hero", "King"]
12
      }
13
    }
14
  }
15
);
  1. 向 username 为 Herry 的文档中,添加一个 hobby: {movies: [‘Ip Man 1’, ‘Ip Man 2’]}
1
db.users.update(
2
  {
3
    username: "Herry"
4
  },
5
  {
6
    $set: {
7
      hobby: {
8
        movies: ["Ip Man 1", "Ip Man 2"]
9
      }
10
    }
11
  }
12
);
  1. 查看喜欢电影为 Hero 的文档
1
// MongoDB 支持直接通过内嵌文档的属性查询
2
// 注意通过内嵌文档查询,属性名必须使用引号括起来
3
db.users.find({
4
  "hobby.movies": "Hero"
5
});
  1. 向 Herry 的文档中添加新电影 Ip Man 3
1
// $push 用于向数组中添加一个新的元素
2
// 题外话:$addToSet 和 $push 拥有相同的功能,只是前者检测到集合中有这个值就不会添加
3
// 而后者不管数据是否重复
4
db.users.update(
5
  {
6
    username: "Herry"
7
  },
8
  {
9
    $push: {
10
      "hobby.movies": "Ip Man 3"
11
    }
12
  }
13
);
  1. 删除喜欢 BeiJing 的用户
1
db.users.remove({
2
  "hobby.cities": "BeiJing"
3
});
  1. 删除 user 集合
1
// 删除集合中所有的文档,效率不高
2
db.users.remove({})
3
// 更加方便的方法为
4
db.users.drop()
  1. 向 numbers 集合中插入 20000 条数据
1
// 这种形式,我的I7电脑都用了9.8s才完成插入
2
for (var i = 1; i <= 20000; i++) {
3
  db.numbers.insert({
4
    num: i
5
  });
6
}
7
8
// 这种形式则舒爽很多,仅仅使用了0.5s
9
var arr = [];
10
for (var i = 1; i <= 20000; i++) {
11
  arr.push({ num: i });
12
}
13
db.numbers.insert(arr);
14
15
// 项目开发中数据库的方法能少调用尽量少调用
  1. 查询 numbers 集合中 num 为 500 的文档
1
db.numbers.find({
2
  num: 500
3
});
4
5
// OR
6
7
db.numbers.find({
8
  num: {
9
    $eq: 500
10
  }
11
});
12
13
// 扩展: 不等于操作符为 $ne
  1. 查询 numbers 中 num 大于 500 的文档
1
// 大于500的
2
db.numbers.find({
3
  num: {
4
    $gt: 500
5
  }
6
});
7
8
// 大于等于500的
9
db.numbers.find({
10
  num: {
11
    $gte: 500
12
  }
13
});
14
15
// 扩展:$lt 小于 | $lte 小于等于
  1. 查询 numbers 中 num 小于 30 的文档
1
db.numbers.find({
2
  num: {
3
    $lt: 30
4
  }
5
});
  1. 查询 numbers 中 num 大于 40 小于 50 的文档
1
db.numbers.find({
2
  num: {
3
    $gt: 40,
4
    $lt: 50
5
  }
6
});
  1. 查询 numbers 中 num 大于 19996 的文档
1
db.numbers.find({
2
  num: {
3
    $gt: 19996
4
  }
5
});
  1. 查看 numbers 集合中的前 10 条数据
1
db.numbers.find().limit(10)
  1. 查看 numbers 集合中的第 11 条到 20 条数据
1
db.numbers.find().skip(10).limit(10)
  1. 查看 numbers 集合中的第 21 条到 30 条数据
1
db.numbers.find().skip(20).limit(10)