Mongodb常见用法

//使用配置文件启动(如未设置环境变量需要在安装路径的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(
<query>, // 查询条件
<update>, // 更新内容
{
upsert: <boolean>, // 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
// 使用$set可直接插入,此参数用处不大
multi: <boolean>, // 是否更新多条匹配数据,默认false,只更新找到的第一条记录
writeConcern: <document> // 可选,抛出异常的级别
}
)

// 以下测试均以以下数据为初始数据
{ "_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 }
结论: <update>直接是对象时,会替换原先的整个对象

// 测试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 }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容