常用命令
mongod --version
检测mongodb版本mongod
开启数据库mongo
连接数据库show dbs & show databases
显示当前所有数据库use test
进入/切换数据库db
表示当前所处数据库show collections
显示数据库中的所有集合
创建删除数据库
use mydb
创建(切换)数据库(里面如果不创建集合或者不插入数据,默认不显示)db.dropDatabase()
删除数据库,删除之前使用use切换到对应的数据库show dbs
查看所有数据库db
查看当前数据库
创建和删除集合
db.createCollection('animal_type')
给数据库中创建集合,创建之前使用use切换到对应数据库 (直接插入数据会自动创建集合)show collections || show tables
查看当前数据库下的所有集合db.animal_type.drop()
删除数据库中的集合
插入文档
-
db.students.insert({name: '张三', age: 23, sex: '男'});
-
db.students.insertOne({name: '李四', age: 24, sex: '女'})
-
db.students.insertMany([])
插入多条数据:db.students.insertMany([ {name: '王麻子', age: 34, sex: '男'}, {name: '刘二', age: 25, sex: '女'} ]);
-
db.students.save({name: '米语', age: 22, sex: '男'})
如果不指定 _id 字段 ,save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
查找文档
db.students.find()
查询数据db.students.find().pretty()
pretty() 方法以格式化的方式来显示所有文档。db.students.findOne()
返回一个格式化的文档db.students.distinct('name')
查询去掉后的当前聚集集合中的某列的重复数据
条件查询
-
db.students.find({name: '米语', age: 23})
查询name="米语"并且age=23的文档 -
db.students.find({$or: [{key: value}, {key: value}]})
查询name="米语"或者age=23的文档db.students.find({ $or: [ {name: '米语'}, {age: 23} ] })
-
db.students.find({age: {$gt: 25}})
查找年龄大于25的 -
db.students.find({age: {$gte: 25}})
查找年龄大于等于25的 -
db.students.find({age: {$lt: 23}})
查找年龄小于23的 -
db.students.find({age: {$lte: 23}})
查找年龄小于等于23的 -
db.students.find({age: {$gte: 23, $lte: 25}})
查找年龄大于等于23小于等于25的 -
db.students.find({age: {$eq: 23}}) || db.students.find({age: 23})
查找年龄等于23的 -
db.students.find({age: {$ne: 23}})
查找年龄不等于23的 -
db.students.find({}, {name: 1, age: 1})
查询指定列name,age数据 -
db.students.find({age: {$gt: 23}}, {name: 1})
查询age大于23的指定列name
模糊查询
db.students.find({name: /米/})
查找包括‘米’字的文档db.students.find({name: /^米/})
查找以‘米’开头的文档db.students.find({name: /语$/})
查找以‘米’结束的文档
排序
db.students.find().sort({age: 1})
以年龄进行升序排序db.students.find().sort({age: -1})
以年龄进行降序排序
Limit与Skip方法
db.students.find().limit(2)
查询前2条数据db.students.find().skip(2)
跳过前2条,查询第2条以后的数据db.students.find().skip(2).limit(2)
查询2到4之前的数据(可用于分页)
count总数
db.students.find().count()
总共多少条数据db.students.find({age: {$lte: 23}}).count()
统计大于等于23的总数db.students.find().skip(3).limit(2).count(true)
要返回限制之后的记录数量,要使用 count(true)或者 count(非 0)
更新文档
db.students.update({name: '米语', age: 23}, {$set: {name: '梁璐'}})
查找name=‘米语’,age=23的文档,把name更改为’梁璐’db.students.update({age: {$gt: 23}}, {$set: {sex: '男'}}, {multi:true})
查找年龄大于23的,将性别更改为‘男’, multi更改所有匹配的数据,默认只更改第一条匹配的数据
删除文档
db.students.remove({name: '米语'})
删除name=‘米语’的文档db.students.remove({age: 23}, {justOne: true})
移除匹配的第一条数据db.students.remove({})
删除所有文档数据
索引
索引通常能够极大的提高查询效率和查询时间。
// 添加多条数据
for (var i = 0 ; i < 2000000; i++) {
db.students.insert({name: ('张三' + i), order: i});
}
db.students.createIndex({name: 1})
创建索引db.students.getIndexes()
查看索引db.students.dropIndex({'name': 1})
删除集合指定索引db.students.dropIndexes()
删除集合所有索引db.students.totalIndexSize()
查看集合索引大小db.students.createIndex({name: 1, order: -1})
复合索引 , 数字 1 表示 username 键的索引按升序存储,-1 表示 age 键的索引按照降序方式存储。
使用 explain
explain 是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用
该方法,就可以得到查询细节。explain 会返回一个文档,而不是游标本身。
db.students.find({name: '张三444444'}).explain( "executionStats" )
聚合
db.students.insertMany([
{name: '张三', age: 23, sex: '男', rank: 88},
{name: '李四', age: 44, sex: '女', rank: 99},
{name: '王麻子', age: 34, sex: '女', rank: 75},
{name: '汪汪', age: 39, sex: '男', rank: 89}
])
- 先按照性别分组,然后获取每组的数量
db.students.aggregate([
{$group: {_id: '$sex', num: {$sum: 1}}}
])
- 计算总分
db.students.aggregate([
{$group: {_id: null, result: {$sum: '$rank'}}}
])
- 获取总数据
db.students.count()
- 获取总条数
db.students.aggregate([
{$group: {_id: null, count: {$sum: 1}}}
])
- 获取ID对应的年龄总数
db.students.aggregate([
{
$group: {_id: '$_id', total: {$sum: '$age'}}
}
])
- 按rank分组,获取每组中最大的
db.students.aggregate([
{
$group: {
_id: '$rank', max: {$max: '$name'}
}
}
])
- 按rank分组,获取每组中最小的
db.students.aggregate([
{
$group: {
_id: '$rank', max: {$min: '$name'}
}
}
])
- 过滤,返回指定的列
db.students.aggregate([
{
$project: {name: 1}
}
])
- 多管道
db.students.aggregate([
{$match: {age: {$gt: 34, $lt: 64}}},
{$group: {_id: '$rank', count: {$sum: 1}}}
])
- skip
db.students.aggregate({$skip: 4})