MongoDB学习

88 阅读2分钟

1. 基础操作与概念

  • 运行 MongoDB
    mongod --config "C:\Program Files\MongoDB\Server\4.4\bin\mongod.cfg"
  • 进入 MongoDB 控制台
    mongo
  • 退出控制台
    exit

1. 数据库操作

  • 展示数据库\
> show dbs
admin  0GB
appdb  0GB
myblog 0GB
  • 进入数据库
    use [数据库名称] -> use test
  • 删除表格
    db.dropDatabase()

2. 集合操作

  • 创建集合
    db.createCollection("集合名", [参数]) db.createCollection("go")
  • 查看集合
    show collections / show tables
  • 删除集合
    db.[集合名].drop()

3. 数据操作

  • 新增数据
db.[集合名].insert(数据)
db.go.insert({name: "test"})
db.go.insertOne({name:"test"}) // 插入一个
db.go.insertMany([{name: "M1"}, {name: "M2"}]) // 插入多个
  • 查询数据
db.[集合名].find({查询条件})
db.go.find() // 查询全部
db.go.findOne() // 查询一个
db.go.find({name: "kejin"}) // 条件查询
db.go.find().pretty() //格式化打印
db.go.find().limit(2) // 只找两个
db.go.find().sort({name: 1})

高级查找

// 相等条件判断
db.go.find({name: { $eq: "kejin"}})
// 不等条件判断
db.go.find({name: { $ne: "kejin"}})

  • 修改 / 更新数据 新增replaceOne()
db.[集合名].update({查询条件}, {修改后的结果})
db.go.update({name: "kejin"}, {name: "kejin dong"})
// 修改指定片段
db.go.update({name: "kejin dong"}, {$set: {age: 20} })
db.go.replaceOne({name: "M1"}, {name: "M1", age: 18})
  • 删除数据 / deleteOne
db.集合名.remove({}) // 全部移除
db.集合名.remove({查询条件})
db.go.remove({name: "kejin dong"})

4. 高级数据操作

  • 大于,小于,等于
    $gt: 大于
    $lt: 小于
    $gte: 大于等于
    $lte: 小于等于
    $ne: 不等于\
db.go.find({age: {$gt: 20}})  // 大于
db.go.find({age: {$gte: 20}})  // 大于等于
db.go.find({age: {$lt: 20}})  // 小于
db.go.find({age: {$gt: 0, $lt: 200}}) // 组合查询
  • 在, 不在 $in: 在
    $nin: 不在
    $exists: true | false
db.集合名.find({"键名": {$in:[值1, 值2, 值3 ...]} }) 
db.集合名.find({"键名": {$nin:[值1, 值2, 值3 ...]} })
db.go.find({age: {$in: [10,100]}})
db.go.find({age: {$exists: true}})
  • or/or / and
db.集合名.find({$or:[{条件1}, {条件2}, {条件3}...]})
db.go.find({$or: [{name: "M1"}]})
db.go.find({$or: [{name: "M1"}, {name: "M2"}]})
  • 模糊查询
db.集合名.find({"键名": js正则表达) 
db.go.find({"name":/M/})
  • 排序 sort, 限定结果 limit, 查询结果量 count, 跳过skip()
db.集合名.find().sort({"键名": 1|-1, "键名": 1|-1...}) #1为升序, -1为降序
db.集合名.find().skip(n).limit(m) # 跳过n条,返回后面的m条
db.集合名.find().skip(n).count(true) # 与skip结合使用时,要加true

5. 聚合函数

db.集合名.aggregate([    <stage1>,    <stage2>,    ...    <stageN>])
// 每个 stage
{ $<stageOperator>: {} }
{ $match: { age: { $gt: 20} } }
{ $group: { _id: "$age" } // 选出一列, 可选多列
{ $sort: { count: -1 } }
{ $count: "age" } // 有几个document有这个value
{ $sort: { <field1>: <-1|1> } }
{ $project: {_id: 0, name: 1}}// 0 不显示 / 1 显示
{ $limit: <number> }
{ $unwind: <arrayReferenceExpression> }
db.go.aggregate( [{$match: {age: {$lt: 50}}}, {$sort: {name: -1}} ])
db.go.aggregate( [{$match: {age: {$lt: 50}}},{$group: {_id:"$age"}}, {$sort: {name: -1}} ])

// match 演示
db.go.aggregate([
  {$match: { name: "M1" }}
])

// group 演示
db.go.aggregate([
  {$group: { _id: "$age" }}
])
db.go.aggregate([
  {$group: { _id: {age:"$age", name: "$name" }}} 
])

// match / group 组合使用
// 先试用group的话,match需要对于group里的列,例如_id.name
db.go.aggregate([
  {$match: { name: "M1"}},
  {$group: { _id: "$age" }}
])

// count 使用
db.go.aggregate([{$count: "age"}]) // 0.21s -> 1000
db.go.aggregate().toArray().length // 1.7s -> 1000
db.go.aggregate().itcount() // 1.4s -> 1000

// sort 使用
db.go.aggregate([{$sort: {name: -1, age: 1}}])

// project 使用
db.go.aggregate([{$project: {_id: 0, name: 1}}])
db.go.aggregate([{$project: {_id: 0, newAge: "$age"}}]) // 重命名

// unwind 使用
{ "_id" : ObjectId("642d23ff2bd61d77e8abdb3b"), "name" : "M1", "age" : 18, "tags" : [ "a", "b" ] }
> db.go.aggregate([{$unwind: "$tags"}])
{ "_id" : ObjectId("642d23ff2bd61d77e8abdb3b"), "name" : "M1", "age" : 18, "tags" : "a" }
{ "_id" : ObjectId("642d23ff2bd61d77e8abdb3b"), "name" : "M1", "age" : 18, "tags" : "b" }

6. Accumulators (group里)

$sum计算总和,$sum:1同count表示计数
$avg计算平均值
$min获取最小值
$max获取最大值
$push在结果文档中插入值到一个数组中,相当于拼接字段
$first根据资源文档的排序获取第一个文档数据
$last根据资源文档的排序获取最后一个文档数据
{ $accumulatorOperator: expression }
{ $sum: "$quantity"}
// 相同年龄的人有多少
db.go.aggregate([{$group:{_id: "$age", count: {$sum: 1}}}])