mogodb非常占磁盘空间,刚启动就要3-4G左后的空间,虚拟机练习时,可以用--smallfiles选项启动
特点 mongodb 文档数据库 文档(Bson=> json 的二进制化) 内部执行引擎为js解释器,把文档存储为bson结构,查询时转为js对象 在磁盘之上 gridfs 与mysql等传统型数据库相比 传统型数据库 结构化数据 固定的字段 每列的数据类类型是一样的 Mongo 表下的每篇文档,都可以有自己的独特的结构(json对象都可以有自己的属性和值) MongoDb的安装 下载mongodb Mongodb 解压 无需编译安装 MongoDb bin/目录中部分可执行文件说明 bsondump 导出bson结构 mongo 客户端 mongod 服务端 mongodump 整体数据库导出 mongoexport 导出容易识别的json文档或cvs文档 mongoimport 整体导入 mongos 路由器(分片时用) 启动MongoDb服务 /path/to/mongodb \ --dbpath /path/to/dbpath \ --logpath /path/to/logpath \ --fork \ --port 27017 or /path/to/mongodb \ -f /path/to/mongodb.conf 参数解释:--dbpath 数据库目录 --logpath 日志目录 --port 端口 默认为27017 --fork 后台运行
基本使用 入门命令 show dbs admin (empty) // 配置 foobar 0.203GB // local 0.203GB // 其他数据库的信息 test 0.203GB // 练习 use [dbname] show tables(show collections) db.help() 创建库: 隐式创建=> use 一个不存在的库,在里面创建集合就会自动创建库 db.createCollection('user'); db.user.insert({name:'lisi',age:22}); db.user.find(); db.user.drop(); db.dropDatabase(); 详细的增删改查 增: db.user.insert({sn:'001'},{sn:'002'},{sn:'003'}); // 可以插入多个文档 删: db.stu.remove({sn:'001'}); // 没有条件会造成删除所有的文档 db.collection.remove(查询表达式,选项); // 选项是指 {justOne:true/false}, 是否只删一行,默认为false db.stu.remove(gender:'m', true); 改: where(改谁) set(改成什么样) db.collection.update(查询表达式,新值,选项); db.stu.update({name:'dalang'},{name:'wudalang'}); //此种用法会直接用{name:'wu dalang'}替换旧的文档,而不是修改. db.stu.update({name:'poxi'}, {$set:{name:'yanpoxi'}}); //使用$set 可以只设置一列 $set 修改某个列的值 $inc 增长某个列的值 $unset 删除某个列 $rename 重命名某个列 $setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段 option:{upsert:true/false,multi:true/false} // 默认只改一行 upsert: 没有则插入 multi: 是否修改多行 查 find,findOne db.stu.find({},{gender:1}); //查询所有文档的gender的gender属性 db.stu.find({}, {gender:1,_id:0}); //查询所有文档的gender属性且不查询id属性 db.stu.find({gender:'male'},{name:1}) //性别为male的name列 查询表达式 符号 | 含义 | 备注 --- | :---:| --- $ne | != | $gt | > | $lt | < | $gte | >= | $lte | <= | | | $in | in | $nin | not in | $or | or | $and | and | $nor | 都不成功时为真 | $mod | | db.goods.find({goods_id:{$mod:[5,0]}},{goods_id:1,cat_id:1,name:1,_id:0}); $exists | 某列存在则为真 | $type | type匹配为真 [MongoDB支持的type](https://docs.mongodb.com/manual/reference/operator/query/type/) | || $where | db.goods.find(); | 效率较低, 需要先把数据转换成js可以是别的json再进行比较(必须转成json对象才能判断) $regex | 正则表达式为真 | 效率较低 游标(cursor)操作 游标是查询的返回资源相当觩hp 中的 resource
通过这个资源可以进行逐条查询
mycusor.next(); // 走向下一个 mycusor.hasNext(); // 是否有下一个 var myCursor = db.bar.find({_id:{$lte:5}}); while(myCursor.hasNext()) { printjson(myCursor.next()); } cursor.forEach(回调函数); myCursor.forEach(function (obj) { //此处obj为游标所在的位置 print('your id is '+obj._id); } ); 游标分页 var myCursor = db.bar.find().skip(9995); // 查询结果中跳过前9995行 var myCursor = db.bar.find().skip(9995).limit(10); // 查询结果中跳过前9995行,取10行 游标数据直接输出 myCursor.toArray(); // 不建议使用,会将数据全部以对象的形式存到内存中. 索引分析查询的效率: db.stu.find(query).explain()
{ "cursor" : "BasicCursor", //说明没有索引发挥作用 "nscanned" : 1003, "nscannedObjects" : 1003, 理论上要扫描多少行 "n" : 1, "millis" : 9, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : { } }db.stu.ensureIndex({sn:1}); 创建索引
> db.stu.find({sn:99}).explain(); { "cursor" : "BtreeCursor sn_1", "nscanned" : 1, "nscannedObjects" : 1, "n" : 1, "millis" : 0, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : { "sn" : [ [ 99, 99 ] ] } } 索引常用命令查看索引
db.collection.getIndexes();
创建索引
单列索引 db.collection.ensureIndex({field1:1/-1}); // 单列索引 多列索引 db.collection.ensureIndex({field1:1/-1, field2:1/-1}); 创建多列索引 1正序 -1倒序 子文档索引 db.shop.insert( { name:'Nokia', spc:{ weight:120, area:'taiwan' } } ); db.shop.find( {'spc.area':'taiwan'} ); db.shop.ensureIndex('spc.area':1); 唯一索引 db.tea.ensureIndex({eamil:1}, {unique:true}); 创建稀疏索引 普通索引会建立空字段的索引 db.collection.find({email:null}); 稀疏索引会忽略掉空字段 db.collection.ensureIndex({email:1},{sparse:true}); 哈希索引根据哈希函数生成特定值得索引位置
db.collection.ensureIndex({email:'hashed'}); db.collection.find({email:[email protected]'}).explain(); // "cursor" : "BtreeCursor email_hashed"删除索引
db.collection.dropIndexes(); // 删掉全部 db.collection.dripIndex({field:1/-1});重建索引
一个表经过多次修改,导致表的文件产生空洞,索引亦然
db.collection.reIndex();作用: 减少磁盘碎片,提高索引效率
MongoDB的使用到此结束,接下来是软件管理 用户管理use admin // 进入超级管理员模式
db.addUser('sa', 'password', false); // 第三个参数为是否只读
(mysqld:--skip-grant-table) mongod 不加--auth 会跳过权限验证