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}})
- 或 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}}}])