[TOC] ## 数据库操作 ### 创建数据库 `use test` ### 展示所有数据库 ``` > show dbs admin 0.000GB config 0.000GB local 0.000GB ``` ### 删除数据库 ``` use test db.dropDatabase() ``` ## 集合(表) ### 创建集合 demo ``` use test db.createCollection("runoob") ``` 创建带参数集合,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个(超过会覆盖旧数据) ``` db.createCollection("runoob", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } ) ``` 插入时,自动创建集合 ``` db.runoob.insert({"name" : "菜鸟教程"}) ``` ### 列出集合 ``` show tables ``` ### 删除集合 ``` use test db.集合名.drop() ``` ## 插入 ### 插入数据时,自动创建 在数据库中添加记录,如果集合不存在会自动创建 ``` //切换/创建库 use demo2 //在表test 中插入数据,如果表不存在就添加 db.test.insert({"name":"123",tags: ['mongodb', 'database', 'NoSQL']}) ``` 如果不指定 \_id 字段 save() 方法类似于 insert() 方法。如果指定 \_id 字段,则会更新该 \_id 的数据 ### update 更新 ``` db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明: query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 writeConcern :可选,抛出异常的级别。 ``` ### update 更新一条 `db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})` 把 title等于 `MongoDB 教程` 更新为 `MongoDB` ### update 更新多条 `db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})` ### save 数据更替 如果 save 中 `_id` 值一样,就进行整体替换 ## 删除 ``` db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } ) 参数说明: query :(可选)删除的文档的条件。 justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。 writeConcern :(可选)抛出异常的级别。 ``` ### 删多条 实例:移除title 为`MongoDB 教程`的数据 ``` >db.test.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 删除了两条数据 ``` ### 删一条 ``` >db.test.remove({'title':'MongoDB 教程'},1) ``` ### 清空 ``` >db.test.remove() ``` ## 查询 格式 ``` db.collection.find(query, projection) query :可选,使用查询操作符指定查询条件 projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 ``` ### projection #### inclusion 指定返回的键,不返回其他键 ``` db.test.find({}, {title: 1, url: 1}) //只返回 title,与url ``` #### exclusion模式 指定不返回的键,返回其他键 ``` db.test.find({}, {title: 0, url: 0}) //返回排除 title 与url ``` > inclusion 与 exclustion 不能混用 > _id 键默认返回,需要主动指定 _id:0 才会隐藏 `db.test.find({}, {title: 1, _id: 0}) // 只返回 title` ### where 语句 ``` db.col.find({"by":"菜鸟教程"}).pretty() => where by = '菜鸟教程' db.col.find({"likes":{$lt:50}}).pretty() => where likes < 50 可选参数 $lt 小于 $lte 小于等于 $gt 大于 $gte 大于等于 $ne 不等于 ``` ### and 条件 每个where 以逗号隔开 ``` >db.col.find({key1:value1, key2:value2}).pretty() ``` ### OR 条件 需要用到 $or 关键字 ``` db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ) ``` ### AND 和 OR 联合使用 ``` db.col.find({ "likes": { $gt: 50 }, $or: [ { "by": "菜鸟教程" }, { "title": "MongoDB 教程" } ] }) ``` ### $type 查询value 的指定类型 > [完整类型表 ](https://www.runoob.com/mongodb/mongodb-operators-type.html) | **类型** | **数字** | **备注** | | --- | --- | --- | | Double | 1 |   | | String | 2 |   | | Object | 3 |   | | Array | 4 |   | ... 测试数据 ``` >db.col.insert({ title: 'PHP 教程', }) >db.col.insert({ title:123456, }) ``` 只查询title值为字符串的 ``` db.col.find({"title" : {$type : 2}}) 或 db.col.find({"title" : {$type : 'string'}}) ``` ### limit `db.col.find({},{"title":1,_id:0}).limit(2)` ### Skip `db.col.find({},{"title":1,_id:0}).limit(1).skip(1)` > skip()方法默认参数为 0 ### sort `db.col.find({},{"title":1,_id:0}).sort({"likes":-1})` > -1 倒叙, 1 顺序,skip(), limilt(), > sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit() ## createIndex 索引 语法 ``` db.collection.createIndex(keys, options) ``` Key 值为你要创建的索引字段,1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 <details> <summary>options 参数</summary> | Parameter | Type | Description | | --- | --- | --- | | background | Boolean | 为true 不阻塞创建索引 默认值为**false**。 | | unique | Boolean | 唯一索引,默认值为**false**. | | name | string | 索引名,不指定自动生成 | | sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为**false**. | | expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 | | v | index version | 索引的版本号 | | weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 | | default\_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 | | language\_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. | </details> <br/> 实例: ``` db.col.createIndex({"title":1,"description":-1}, {background: true}) ``` ``` 1、查看集合索引 db.col.getIndexes() 2、查看集合索引大小 db.col.totalIndexSize() 3、删除集合所有索引 db.col.dropIndexes() 4、删除集合指定索引 db.col.dropIndex("索引名称") ```