mongoDB 基础知识
Laiyong Wang Lv5

基本概念

  • 数据库(Database):是集合的容器,相当于关系型数据库中的数据库。
  • 集合(Collection):数据库中的一组文档,相当于关系型数据库中的表。
  • 文档(Document):集合中的一条记录,相当于关系型数据库表中的一行,不同的文档之间不必有相同的结构。
  • 字段(Field):文档中的键值对,相当于关系型数据库中的列。一个字段可以是一个 JSON 对象或数组。

基本命令

  • 显示所有数据库show databasesshow dbs
  • 切换到某个数据库use <dbname>
  • 显示当前使用中的数据库名称db
  • 显示当前数据库中的所有集合show collections
  • 删除集合db.collectionName.drop()
  • 删除当前数据库db.dropDatabase()
  • 退出 mongosh 会话exit

创建和插入数据

  • 插入一个新文档
    1
    db.user.insertOne({ name: "王" })
  • 插入多个新文档
    1
    db.user.insertMany([{ name: "来" }, { name: "勇" }])
  • 先插入一百条数据供查询使用
    1
    for (var i=1;i<=100;i++) db.user.insertOne({name:i,age:i,group:Math.floor(i/10)})

查询数据

  • 查询所有文档
    1
    db.users.find()
  • 根据条件查询文档
    1
    db.users.find({ name: "1" })
  • 查询并只返回指定字段
    1
    db.users.find({ name: "2" }, { age: 1})
  • 查询满足条件的第一条记录
    1
    db.users.findOne({ age: 12 })
  • 返回满足条件的记录数量
    1
    db.users.countDocuments({ group: 3 })

常用聚合操作

  • 计算总和$sum
    1
    2
    3
    4
    //按照 group 分组
    db.user.aggregate([ { $group: { _id: "$group", totalAge: { $sum: "$age" } } }] );
    //不分组
    db.user.aggregate([ { $group: { _id: null, totalAge: { $sum: "$age" } } }] );
  • 计算平均值$avg
    1
    2
    3
    4
    //按照 group 分组
    db.user.aggregate([ { $group: { _id: "$group", totalAge: { $sum: "$age" } } }] );
    //不分组
    db.user.aggregate([ { $group: { _id: null, totalAge: { $sum: "$age" } } }] );
  • 获取最小值$min
    1
    2
    3
    4
    //按照 group 分组
    db.user.aggregate([ { $group: { _id: "$group", minAge: { $min: "$age" } } }] );
    //不分组
    db.user.aggregate([ { $group: { _id: null, minAge: { $min: "$age" } } }] );
  • 获取最大值$max
    1
    2
    db.user.aggregate([ { $group: { _id: "$group", maxAge: { $max: "$age" } } }] );
    db.user.aggregate([ { $group: { _id: null, maxAge: { $max: "$age" } } }] );

更新数据

  • 更新满足条件的所有文档
    1
    db.users.updateMany({ name: "34" }, { $set: { age: 30 } })
  • 更新满足条件的第一个文档
    1
    db.users.updateOne({ name: "45" }, { $set: { age: 30 } })
  • 替换满足条件的第一个文档
    1
    db.users.replaceOne({ name: "12" }, { name: "34", age: 30 })

删除数据

  • 删除满足条件的所有文档
    1
    db.users.deleteMany({ group: "4" })
  • 删除满足条件的第一个文档
    1
    db.users.deleteOne({ name: "45" })

过滤条件

  • 不等于$ne
    1
    db.user.find({ age: { $ne: 25 } });
  • 等于$eq
    1
    db.user.find({ age: { $eq: 25 } });
  • 大于 / 大于等于$gt / $gte
    1
    db.user.find({ age: { $gt: 25 } });
  • 小于 / 小于等于$lt / $lte
    1
    db.user.find({ age: { $lt: 25 } });
  • 在指定值列表中$in
    1
    db.user.find({ age: { $in: [25, 30, 35] } });
  • 不在指定值列表中$nin
    1
    db.user.find({ age: { $nin: [25, 30, 35] } });
  • 并且$and
    1
    db.user.find({ $and: [{ age: { $gt: 20 } }, { age: { $lt: 30 } }] });
  • 或者$or
    1
    db.user.find({ $or: [{ age: { $gt: 20 } }, { age: { $lt: 30 } }] });
  • 取反$not
    1
    db.user.find({ age: { $not: { $gt: 25 } } });
  • 字段是否存在$exists
    1
    db.user.find({ age: { $exists: true } });
  • 字段间比较$expr
    1
    db.user.find({ $expr: { $gt: ["$name", "$age"] } });

高级查询操作

  • 更新文档的特定字段$set
  • 递增或递减字段值$inc
  • 重命名字段$rename
  • 删除字段$unset
  • 将值加入数组(允许重复)$push
  • 从数组中移除值$pull
  • 将值加入数组(不允许重复)$addToSet
  • 排序sort
  • 限定返回文档数量limit
  • 跳过文档数量skip