//使用配置文件启动(如未设置环境变量需要在安装路径的bin文件夹下运行)
mongod --config c:\mongodb\etc\mongo.conf
//进入shell控制台
//如未启动mongodb将无法连接
mongo
添加用户
//显示已有的数据库
show dbs
//进入admin数据库
use admin
//创建用户帐号
//注意role角色指定,链接里有详细说明
//root拥有最高权限,可以增删用户,修改数据
//userAdminAnyDatabase 可以新增用户,修改数据,不能删除用户
//平时使用root帐号即可
db.createUser({'user':'admin',pwd:'admin',roles:[{role:'root',db:'admin'}]}) db.createUser({'user':'lee',pwd:'123',roles:[{role:'userAdminAnyDatabase',db:'admin'}]})
//查看已有用户
show users 或 db.system.users.find()
//使用认证方式启动mongodb
mongod --config c:\mongodb\etc\mongo.conf --auth
//此时连上数据库执行任何命令会提示未授权
//进行认证,提示数字1表示成功
//如无法验证,请尝试先使用use进入一个数据库
db.auth('admin','admin')
//删除某个数据库下的所有用户
db.system.users.remove()
//删除指定用户
db.system.users.remove({user:'zhangsan'})
基本术语介绍
以以下数据库结构为例
admin
local
test
students
{_id:'12312453432',name:'zhangsan',age:18}
{_id:'12312453433',name:'lisi',age:32}
数据库(database):admin,local,test
集合(collection):students //类似mysql中的表
文档(document): {name:'zhangsan',age:18} //类似mysql中的列
域/字段(field):name:'zhangsan' //键值对
索引(index): 自行指定
表连接(table joins): 不支持
主键(primary key): 默认生成_id字段,并设置为主键
// 查看数据库
show dbs
// 进入/切换数据库
// use后新增数据默认新增了这个数据库,无数据则表示数据库不存在
use test
// 查看当前数据库
db
// 删除当前数据库(如开启了验证,需要使用root帐号执行)
db.dropDatabase()
// 查看当前数据库已有的集合
show collections
// 创建集合
// 使用insert可以默认创建
db.createCollection('students')
// 删除单个集合
db.students.drop()
插入文档
// 在test数据下进行实验
use test
// 方式一:insert插入
// 直接插入
db.students.insert({name:'st1',age:18})
// 声明变量插入
// a. 对象形式
document = {
name: 'st2',
age: 32
}
db.students.insert(document)
// b. 数组形式
document = [
{
name: 'st3',
age: 12
},
{
name: 'st4',
age: 55
}
]
db.students.insert(document)
// 方式二:通过json文件插入
// 在cmd中执行,不是在mongo shell
// 如果数据库test或集合students不存在,都会默认创建
// 如果已有数据,会在后续添加,不会覆盖
mongoimport --db test --collection students --file c:\mongodb\test_file\students.json --jsonArray
注意!!
对于json格式的数据必须后面加参数 --jsonArray 否则报错
因为不加会默认数据是find()返回的数据格式,如
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
在json文件中保存这种数据库中的数据格式则不能加 --jsonArray
更新文档
// 当前已有数据
db.students.find()
{ "_id" : ObjectId("598539dbd7689da968778c89"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("598539e1d7689da968778c8a"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("598539e7d7689da968778c8b"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 55 }
// updata更新语法
db.collection.update(
{
upsert:
// 使用$set可直接插入,此参数用处不大
multi:
writeConcern:
}
)
// 以下测试均以以下数据为初始数据
{ "_id" : ObjectId("598539dbd7689da968778c89"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("598539e1d7689da968778c8a"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("598539e7d7689da968778c8b"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 32 }
// 测试1-- 基础格式
db.students.update({name:'st4'}, {age:50})
db.students.find()
{ "_id" : ObjectId("598539dbd7689da968778c89"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("598539e1d7689da968778c8a"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("598539e7d7689da968778c8b"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "age" : 50 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 32 }
结论:
// 测试2-- $set
// 已还原为初始数据
db.students.update({name:'st4'}, {$set:{age:5}})
db.students.find()
{ "_id" : ObjectId("598539dbd7689da968778c89"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("598539e1d7689da968778c8a"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("598539e7d7689da968778c8b"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 5 }
{ "_id" : ObjectId("59853d01d7689da968778c8d"), "name" : "st4", "age" : 32 }
结论: 使用$set关键字可单独修改一个字段的值,而不是整体覆盖
其他操作语法(https://m.aliyun.com/yunqi/ziliao/5371)
$unset: 删除指定字段
$push: 给子文档push一个新值, 子文档必须为数组,子文档不存在时自动创建
$pushAll: 给子文档push多个新值
$addToSet: 给子文档加一个新值, 前提是这个新值原先没有一样的值在子文档里
$pop: 删除数组内第一个值:{$pop:{field:-1}},删除数组内最后一个值:{$pop:{field:1}}
$pull: 删除一个指定值
$pullAll: 删除一个指定值
$rename: 重命名一个指定值
// 测试3-- multi
// 已还原为初始数据
db.students.update({name:'st4'}, {$set:{age:5}},{multi:true})
// db.students.update({name:'st4'}, {$set:{age:5}},false, true) 简写
db.students.find()
{ "_id" : ObjectId("598539dbd7689da968778c89"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("598539e1d7689da968778c8a"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("598539e7d7689da968778c8b"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("598539e7d7689da968778c8c"), "name" : "st4", "age" : 5 }
{ "_id" : ObjectId("59853d01d7689da968778c8d"), "name" : "st4", "age" : 5 }
查找文档
// find查找语法
// query :可选,使用查询操作符指定查询条件
// projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)
db.collection.find(query, projection) //返回所有匹配数据
db.collection.findOne(query, projection) //返回第一条匹配数据
// 以下测试均以以下数据为初始数据
{ "_id" : ObjectId("5987202e51e204de04c0bff7"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("5987202e51e204de04c0bffa"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("5987202e51e204de04c0bffb"), "name" : "st4", "age" : 99 }
{ "_id" : ObjectId("5987202e51e204de04c0bffc"), "name" : "st4", "age" : 7 }
{ "_id" : ObjectId("5987202e51e204de04c0bffd"), "name" : "st5", "age" : 88 }
// 测试一 --基本键值对匹配
db.students.find({name:'st4'}) //可以不打引号
{ "_id" : ObjectId("5987202e51e204de04c0bffa"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("5987202e51e204de04c0bffb"), "name" : "st4", "age" : 99 }
{ "_id" : ObjectId("5987202e51e204de04c0bffc"), "name" : "st4", "age" : 7 }
结论: 直接根据键值对匹配来查询,可传入多组键值对(键可以不加引号,推荐加上与数据一致)
// 测试二 --$gt...数字比较查找
db.students.find({age:{$gt:30}})
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("5987202e51e204de04c0bffa"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("5987202e51e204de04c0bffb"), "name" : "st4", "age" : 99 }
{ "_id" : ObjectId("5987202e51e204de04c0bffd"), "name" : "st5", "age" : 88 }
结论:可使用lt,lte,gt,gte,ne(不等于)关键字来查询,可传入多个限制条件
字符串可以比较,同js按照UTF-8字典排序,但是用处不大
// 测试三 --$regex字符通过正则查询
db.students.find({name:{$regex:/st2/}})
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
结论:通过正则来查找相似字符串
// 测试四 --$or或查询
db.students.find({$or:[{name:'st3'},{age:88}]})
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("5987202e51e204de04c0bffd"), "name" : "st5", "age" : 88 }
结论: 对$or关键字传入多个匹配来筛选
有$and形式,但是不需要,因为使用多个键值对的形式效果一样
// 测试五 --limit()限制数目
db.students.find().limit(3)
{ "_id" : ObjectId("5987202e51e204de04c0bff7"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
结论: 参数必须为数字,其他报错
0 表示全部
小数会向下取值(0.*的情况特殊)
0.1 -> 1
0.9 -> 1
1.9 -> 1
3.9 -> 3
负数取绝对值(小数会在取绝对值后再向下取值,无特殊情况)
-3 -> 3
-3.9 -> 3
-0.1 -> 0
// 测试六 --skip()跳过数目
db.students.find().skip(2)
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("5987202e51e204de04c0bffa"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("5987202e51e204de04c0bffb"), "name" : "st4", "age" : 99 }
{ "_id" : ObjectId("5987202e51e204de04c0bffc"), "name" : "st4", "age" : 7 }
{ "_id" : ObjectId("5987202e51e204de04c0bffd"), "name" : "st5", "age" : 88 }
结论:参数必须为0或正数,其他报错
小数遵循向下取值规则
0.1 -> 0
0.9 -> 0
2.9 -> 2
// 测试七 --sort()根据属性排序
db.students.find().sort({age:1})
{ "_id" : ObjectId("5987202e51e204de04c0bffc"), "name" : "st4", "age" : 7 }
{ "_id" : ObjectId("5987202e51e204de04c0bff9"), "name" : "st3", "age" : 12 }
{ "_id" : ObjectId("5987202e51e204de04c0bff7"), "name" : "st1", "age" : 18 }
{ "_id" : ObjectId("5987202e51e204de04c0bff8"), "name" : "st2", "age" : 32 }
{ "_id" : ObjectId("5987202e51e204de04c0bffa"), "name" : "st4", "age" : 55 }
{ "_id" : ObjectId("5987202e51e204de04c0bffd"), "name" : "st5", "age" : 88 }
{ "_id" : ObjectId("5987202e51e204de04c0bffb"), "name" : "st4", "age" : 99 }
结论:参数为对象形式,只能取值1(正序)或-1(反序)
传入多个键值对时,优先按照第一个键值对排序
对于不存在的属性会跳过
最后的匹配顺序是在数据库中的默认顺序
// 查询子文档
属性名必须带引号
http://www.cnblogs.com/wuxiang/p/5525835.html
索引
索引通常能够极大的提高查询的效率
// ensureIndex语法
// index为对象,指定属性为索引属性和排序方式
// parameter可选,是对索引的配置参数,详细 http://www.runoob.com/mongodb/mongodb-indexing.html
db.COLLECTION_NAME.ensureIndex(index,parameter)
示例
db.students.ensureIndex({age:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
聚合
用于处理数据(诸如统计平均值,求和,最大值,最小值等),并返回计算后的数据结果
// _id(命名不可自定义)表示组划分依赖的字段
// num_tutorial(命名可自定义)表示在展示结果中的显示字段,$num表示格式,1表示倍数,会将结果乘以该值
db.students.aggregate([{$group : {_id : "$name", num_tutorial : {$sum : 1}}}])
{ "_id" : "st5", "num_tutorial" : 1 }
{ "_id" : "st2", "num_tutorial" : 1 }
{ "_id" : "st4", "num_tutorial" : 3 }
{ "_id" : "st3", "num_tutorial" : 1 }
{ "_id" : "st1", "num_tutorial" : 1 }