MongoDB 4.0.10 CRUD操作(增删改查)
- 新增:当向集合插入文档时,如果没有给文档指定_id属性(可以自行指定),则数据库会自动为文档添加一个_id,该属性用来作为文档的唯一标识,可以使用ObjectId()生成
- 一次性插入大量数据:可以先把所有数据放在一个新数组中,然后一次性插入数组
1 /* <collection>集合名,doc是需要插入的对象 2 db.<collection>.insert(doc) 向当前数据库的集合中插入一个或多个文档,doc为一个json对象或者json对象的List列表 3 db.<collection>.insertOne(doc) 向当前数据库的集合中 插入一个文档,doc为一个json对象 4 db.<collection>.insertMany(doc) 向当前数据库的集合中插入多个文档,doc为json对象的List列表 5 */ 6 // 示例如下 7 db.runoob.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个Nosql数据库', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 1200 }); 8 var doc1 = {title: 'HTML 教程', description: 'HTML编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['HTML', 'JavaScript', 'CSS'], likes: 1010 } 9 var doc2 = {title: 'ASP.NET 教程', description: 'ASP.NET编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['Web Froms', 'Web API', 'MVC', 'WCF'], likes: 1000 } 10 var doc3 = {title: 'JAVA 教程', description: 'JAVA编写网页', by: '菜鸟教程', url: 'http://www.runoob.com', tags: ['JSP', 'Spring'], likes: 1560} 11 db.runoob.insert([doc1,doc2,doc3]); //一次性插入多个数据 12 db.runoob.find()
- 删除:remove()方法不会真正的释放空间,需要继续执行db.repairDatabase()回收磁盘空间
1 /* db.<collection>.remove(<query>,<option>) 删除所有符合条件的文档,默认情况删除多个 2 option:justOne为true时,只删除一个,默认为false;writeConcern:抛出异常的级别 3 db.<collection>.remove({}) 删除集合的所有文档,传递的是一个空参数,这是一条条删除,性能较低 4 db.<collection>.deleteOne() 删除一个符合条款的文档 5 db.<collection>.deleteMany() 删除所有的符合条件的文档 6 */ 7 db.runoob.remove({_id:ObjectId("5d352450b595146edeaac430")}) 8 db.runoob.remove({by:"菜鸟教程"},true) //只删除一个 9 db.runoob.find()
- 修改
1 /* 如果需要修改指定属性,需要使用 修改操作符 $set:用来修改文档中的指定属性;$unset:用来删除文档中的指定属性 2 db.<collection>.update(<query>,<update>,<options>) 使用新对象替换符合查询条件的旧对象,当有多个符合条件的对象,默认只修改一个 3 <query>:查询条件,类似where语句;<update>:新文档,类似于update语句中的set,需要使用修改操作符 4 <options>:可选配置 5 upsert:为true时,如果没有匹配到符合的文档,则进行插入,默认false; 6 multi:为true时,可以一次性修改所有符合条件的文档; 7 writeConcern:抛出异常的级别 8 可以修改可选参数配置的multi:true 9 db.<collection>.updateMany() 同时修改多个符合条件的文档 10 db.<collection>.updateOne() 修改一个符合条件的文档 11 db.<collection>.replaceOne() 替换一个文档 12 db.<collection>.save(doc) 保存文档 13 save()方法接受一个键值对对象作为参数,如果指定的文档已经存在于数据库中,就将其更新为指定的值,否则插入一个文档,应该是根据_id匹配 14 */ 15 db.runoob.update({title:"MongoDB 教程"},{by:"新菜鸟教程"}) // 直接把{by:"新菜鸟教程"}替换到旧文档中了 16 db.runoob.update({title:"HTML 教程"},{$set:{url:"new url"},$inc:{likes:100}}) // set url="new url",likes+=100 17 db.runoob.update({title:"ASP.NET 教程"},{$unset:{url:""}}) // 移除url属性 18 db.runoob.updateMany({by:"菜鸟教程"},{$set:{by:"新菜鸟教程"}}) // 修改全部符合条件文档 19 db.runoob.update({by:"新菜鸟教程"},{$set:{by:"菜鸟教程"}},{multi:true}) // 修改全部符合条件文档 20 db.runoob.find()
- 查询
1 /* 传递的参数是筛选条件 {字段名:字段值} 等同 where 字段名=字段值 2 db.<collection>.find(query, projection) 查询集合中所有符合条件的文档,返回一个数组 3 db.<collection>.findOne(query, projection) 查询集合中所有符合元素的第一个文档,返回一个对象 4 db.<collection>.find(query, projection).count() 返回集合中所有符合元素的文档的数量,返回一个数字 5 db.<collection>.find(query, projection).pretty() 查询集合中所有符合条件的文档,格式化显示 6 query:查询条件;projection:使用投影操作符指定显示的字段 7 */ 8 db.runoob.find() //select * from runoob 9 db.runoob.find({}) //select * from runoob 10 db.runoob.find({_id:ObjectId("5d352450b595146edeaac430")}) // select * from runoob where _id=ObjectId("5d352450b595146edeaac430") 11 db.runoob.find({by:"菜鸟教程",title:"MongoDB 教程"}) // select * from runoob where by="菜鸟教程" and title="MongoDB 教程" 12 db.runoob.findOne({by:"菜鸟教程"}) // select TOP 1 * from runoob where by="菜鸟教程" 13 db.runoob.findOne({title:"MongoDB 教程"})._id // 返回一个值=(select _id from runoob where title="MongoDB 教程") 14 db.runoob.find({}).count() // select COUNT(1) from runoob 15 //select title from runoob where title="HTML 教程" {title:1,_id:0} 1代表显示,0代表不显示 16 db.runoob.find({title:"HTML 教程"},{title:1,_id:0}) 17 18 db.runoob.distinct("tags",{by:"菜鸟教程"}) // 查找by="菜鸟教程"的tags属性组合为一个数组,且去重 19 db.runoob.find({"key.chl":values}) // 查找子文档属性key下的chl属性为values的文档
- Update():修改新值使用的修改修饰符
1 $inc // 增加 2 $rename // 重命名某一列 3 $serOnInsert // 当upsert为true时,并进行insert操作时,可以补充的字段 4 $set // 用来修改文档中的指定属性 5 $unset // 用来删除文档中的指定属性 6 db.runoob.update({title:"HTML 教程"},{$set:{url:"new url"},$inc:{likes:100}}) // set url="new url",likes+=100 7 db.runoob.update({title:"ASP.NET 教程"},{$rename:{url:"newurl"}}) // 重命名某一列,将url列改为newurl 8 // 如果没有符合条件的文档,则直接插入该文档 9 db.runoob.update({title:"CSS 教程"},{$set:{description:"CSS learn"},$setOnInsert:{by:"菜鸟教程"}},{upsert:true}) 10 db.runoob.updateMany({by:"菜鸟教程"},{$set:{by:"新菜鸟教程"}}) // 修改全部符合条件文档 11 db.runoob.update({title:"ASP.NET 教程"},{$unset:{url:""}}) // 移除url属性 12 $addToSet // 在既有数组上添加元素,格式为 {$addToSet:{key:value}},key为数组类型的属性 13 $pop // 删除数组的第一个元素或最后一个元素,格式为 {$pop:{key:1/-1}},key为数组类型的属性;为1时删除第一个元素,为-1时删除最后一个元素 14 $pullAll // 从数组中删除多个值,格式为 {$pullAll:{key:[value1,value2...]}} 15 $pull // 从数组中删除符合查询条件的文档,格式为 {$pull:{key:<query>}} 16 $push // 在数组中添加一个元素,对于简单数组,格式为 {$push:{key:add_value}};对于对象数组,格式为 {$push:{key:{field:add_value}}} 17 $each // 在数组添加多个元素,格式为 {key:{$each:[value1,value2...]}},{$push:{key:{$each:[value1,value2...]}}},$push和$addToSet的限制符 18 $slice // 用于限制更新后的数组长度,格式为 {key:{$slice:<num>}},$push的限制符 19 $sort // 用来将数组中的文档重新排序,$push的限制符 20 $bit // 对整数值执行按位与和或元素,格式为 {$bit:{key:{and:<int>}}},使用and、or、XOR
- 查询表达式
- 条件操作符:$gt:>大于;$lt:<小于;$gte:>=大于等于;$lte:<=小于等于;$ne:!=不等于;$eq:=等于;$in:in;$nin:not in;$all:指数组所有单元匹配;$size:判断数组类型的属性长度;$elemMatch:判断数组类型属性或者判断子文档数组中的字段
- 逻辑操作符:$or:or或者;$and:and;$not:not;$nor:指所有的列举条件都不应成功则为真;
- 元素运算符:$exists:某列存在则为真;$mod:满足某求余条件则为真;$type:匹配字段的数据类型,并返回结果
- limit()方法:接受一个数字参数,该参数指定从MongoDB中读取的记录条数
- skip()方法:来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
- sort()方法:通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
- JS运算符:$where:js表达式为真则为真;$regex:正则表达式匹配为真则为真
1 db.col.find({key:value}) // 等于 {<key>:<value>} where key=value 2 db.col.find({key:{$lt:1000}}) // 小于 {<key>:{$lt:<value>}} where key<1000 3 db.col.find({key:{$lte:1000}}) // 小于等于 {<key>:{$lte:<value>}} where key<=1000 4 db.col.find({key:{$gt:1000}}) // 大于 {<key>:{$gt:<value>}} where key>1000 5 db.col.find({key:{$gte:1000}}) // 大于等于 {<key>:{$gte:<value>}} where key>=1000 6 db.col.find({key:{$ne:1000}}) // 不等于 {<key>:{$ne:<value>}} where key!=1000 7 db.col.find({key:{$gt:40,$lt:50}}) // where key>40 and key<50 8 db.col.find({key:{$in:[value1,value2...]}}) // where key in (value1, value2) 9 db.col.find({key:{$nin:[value1,value2...]}}) // where key not in (value1, value2) 10 dd.col.find({key:{$all:[value1,value2...]}}) // 匹配key中包含value1,value2...元素的文档 11 db.col.find({key:{$size:N}}) // key属性为数组类型,匹配key数组长度为N的文档 12 13 db.col.find({key1:value1, key2:value2}) // and操作 where key1=value1 and key2=value2 14 db.col.find({$and:[{key:{$gte:100}},{key:{$lte:500}}]}) // and操作 where key>=100 and key<=500 15 db.col.find({$or:[{key1: value1},{key2:value2}]}) // or操作 where key1=value1 or key2=value2 16 db.col.find({key1:value1,$or:[{key2:value2},{key3:value3}]}) // where key1=value1 and (k2=v2 or k3=v3) 17 db.col.find({key:{$not:{$in:[10,12,13]}}}) // where key not in(10,12,13) 18 db.col.find({$nor:[{key1:value1}, {key2:value2},....]}) // where key1!=value1 and key2!=value2..... 19 20 db.col.find({key:/教/}) // 查询key字段包含"教"字的文档 where key like '%教%' 21 db.col.find({key:/^教/}) // 查询key字段以"教"字开头的文档 where key like '%教' 22 db.col.find({key:/教$/}) // 查询key字段以"教"字结尾的文档 where key like '教%' 23 24 db.col.find({key:{$exists:1}}) // 不为0时匹配key属性存在的文档;为0时匹配key属性不存在的文档 25 db.col.find({key:{$mod:[5,0]}}) // 匹配key%5=0的文档 26 db.col.find({key: {$type : 2}}) // 匹配key字段中数据类型为string的文档 27 db.col.find({key: {$type : 'string'}}) // 匹配key字段中数据类型为string的文档 28 29 db.col.find().limit(10) // 取符合条件的前10条文档 30 db.col.find().limit(10).skip(10) // 跳过前10条文档,取第11-20条文档 31 db.col.find().sort({key:1}) //查询出的结果安装key字段升序排列 32 //skip(), limit(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit() 33 //skip()和limit()可以用于少量数据的分页,但是对于大数据情况下,假设查询第100001条数据,这条数据的key值是:2399927 34 db.col.sort({key:1}).skip(100000).limit(10) //183ms,按key升序排列,跳过前100000条文档,取10条文档 35 db.col.find({key:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms,取大于key的文档,排序,取10条 36 37 db.col.find({$where:'this.likes>1000'}) // 匹配col集合中的likes>1000的文档,效率低 38 db.col.find({key:{$regex:正则表达式}}) // 匹配key属性中符合正则表达式的文档
- 配置数据库连接错误处理
1 mongo = new Mongo('localhost:27017') // 连接服务器 2 test = mongo.getDB('test') // 获取数据库test 3 // 配置数据库连接错误处理 4 // w:指定数据库错误连接写入的等级(-1 忽略网络错误、0 不要求进行写入确认、1 要求写入确认、2 要求已写入到副本集的主节点和从节点、majority 要求已经写入复制集绝大数服务器) 5 // wtimeout:等待时间,单位毫秒 6 // j:布尔值,如果为true,则写入请求将会等到日记同步完成后返回 7 // fsync:布尔值,如果为true,则写入请求将会等到日记fsync完成后返回 8 test.runCommand({getLastError:1,w:1,j:true,wtimeout:1000}); 9 test.auth('DEV','123456') // 身份验证 10 numcoll = test.getCollection('numbers') // 获取集合numbers 11 numcoll.insert({num:30000}) // 插入数据 12 result = test.runCommand({getLastError:1}) 13 if(result.err){ 14 print(result.err) 15 }