标签:i++ download writer tee 存在 支持 如何 数值 多个
本篇主要介绍MongoDB可视化操作以及shell使用及命令,备份恢复、数据导入导出。
使用mongo.exe 管理数据库虽然可行,功能也挺强大,但每次都要敲命令,即繁琐枯燥而且效率低下。MongoDb在Windows下的可视化操作的管理工具非常多,笔者从中找了几款使用了一翻,最后挑了一款MongoVUE来最简单介绍,因为笔者觉得MongoVUE界面看上去舒服些。
下载地址:http://www.mongovue.com/downloads/
注意:官方提供的是收费版,试用期15天。但是天朝的东西,你懂的,破解很容易。
运行效果如下图所示。
添加数据库连接之前,要先运行Mongo服务,然后添加Mongo数据库连接,如下图所示。
> show collections persons system.indexes > db.persons.find() { "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" } { "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" }
db.[documentName].insert({})
> for(var i=0;i<10;i++){ ... db.persons.insert({name:‘test‘+i})} WriteResult({ "nInserted" : 1 }) > db.persons.find() { "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" } { "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" } { "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" } { "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" } { "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" } { "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" } { "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" } { "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" } { "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" } { "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" } { "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" } { "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" } >
save操作和insert操作的区别在于当遇到_id相同的情况下,save完成保存操作,而insert则会报错
我们先来看下insert操作,先插入一条01的记录,然后再插入一条_id为01的记录会报错,因为_id重复了。
> db.persons.insert({_id:"01",name:1}) WriteResult({ "nInserted" : 1 }) > db.persons.insert({_id:"01",name:2}) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error index: myTest.persons.$_id_ dup key: { : \"01\" }" } }) >
再来看下save操作,直接将_id为01的记录更新了,name由1更新为了2
> db.persons.save({_id:"01",name:2}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.persons.find() { "_id" : ObjectId("593959250ab68d9cc7011a93"), "name" : "玉杰" } { "_id" : ObjectId("59395c350ab68d9cc7011a94"), "name" : "楚留香" } { "_id" : ObjectId("593b489e29b0f45384dfaafa"), "name" : "test0" } { "_id" : ObjectId("593b489e29b0f45384dfaafb"), "name" : "test1" } { "_id" : ObjectId("593b489e29b0f45384dfaafc"), "name" : "test2" } { "_id" : ObjectId("593b489e29b0f45384dfaafd"), "name" : "test3" } { "_id" : ObjectId("593b489e29b0f45384dfaafe"), "name" : "test4" } { "_id" : ObjectId("593b489e29b0f45384dfaaff"), "name" : "test5" } { "_id" : ObjectId("593b489e29b0f45384dfab00"), "name" : "test6" } { "_id" : ObjectId("593b489e29b0f45384dfab01"), "name" : "test7" } { "_id" : ObjectId("593b489e29b0f45384dfab02"), "name" : "test8" } { "_id" : ObjectId("593b489e29b0f45384dfab03"), "name" : "test9" } { "_id" : "01", "name" : 2 } >
db.[documentName].remove()
集合的本身和索引不会被删除。删除文档是永久性的,不能撤销,也不能恢复的。因此,在执行remove()函数前先用find()命令来查看下是否正确,是个比较好的习惯啦。
> db.persons.remove({}) WriteResult({ "nRemoved" : 13 }) > db.persons.find() > show collections persons system.indexes > db.system.indexes.find() { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "myTest.persons" } >
删除集合persons中name等于yujie的记录
remove()函数可以接受一个查询文档作为可选参数来有选择性的删除符合条件的文档
先来插入几条测试记录
> db.persons.insert({name:"yujie"}) WriteResult({ "nInserted" : 1 }) > db.persons.insert({name:"zouqj"}) WriteResult({ "nInserted" : 1 }) > db.persons.find() { "_id" : ObjectId("593b4c5329b0f45384dfab04"), "name" : "yujie" } { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } >
再来删除name等于yujie的记录
> db.persons.remove({name:"yujie"}) WriteResult({ "nRemoved" : 1 }) > db.persons.find() { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } >
如果你想清除一个数据量十分庞大的集合,直接删除该集合并且重新建立索引的办法比直接remove的效率要高很多。
db.[documentName].update(参数1,参数2,[参数3],[参数4])
db.[documentName].update({查询器},{修改器})
> db.persons.insert({name:"yujie",age:29}) WriteResult({ "nInserted" : 1 }) > db.persons.find() { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } { "_id" : ObjectId("593b540529b0f45384dfab06"), "name" : "yujie", "age" : 29 } > db.persons.update({name:"yujie"},{age:30}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.persons.find() { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } { "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 } >
原本我是想把name等于yujie的记录,将其age更新为30,可是会发现虽然age更新为30了,但是也把"name" : "yujie"直接给删除了。因为:强硬的更新会用新的文档替代老的文档,其实就相当于先删除再插入的操作。
因为是强硬替换,当替换的文档和已有的文档ID冲突的时候,系统会报错。
先来插入几条测试记录
> db.persons.insert({_id:1,name:"test1"}) WriteResult({ "nInserted" : 1 }) > db.persons.insert({_id:2,name:"test2"}) WriteResult({ "nInserted" : 1 }) > db.persons.find() { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } { "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 } { "_id" : 1, "name" : "test1" } { "_id" : 2, "name" : "test2" } >
然后我们再来强硬更新,会发现报错了。
> db.personso.update({_id:1},{_id:2,name:"test2"}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 }) > db.persons.update({_id:1},{_id:2,name:"test2"}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 16837, "errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 2.0}." } }) >
db.[documentName].update({查询器},{修改器},true)
目的:查询器查出来数据就执行更新操作,查不出来就替换操作。
> db.persons.update({_id:3},{_id:3,name:"test3"},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 3 }) > db.persons.find() { "_id" : ObjectId("593b4c5e29b0f45384dfab05"), "name" : "zouqj" } { "_id" : ObjectId("593b540529b0f45384dfab06"), "age" : 30 } { "_id" : 1, "name" : "test1" } { "_id" : 2, "name" : "test2" } { "_id" : 3, "name" : "test3" } >
默认情况下,当查询器查询出多条数据的时候默认就修改第一条数据,如何实现批量修改:
db.[documentName].update({查询器},{修改器},false,true)
修改器名称 | 语法 | 说明 | 示例 |
---|---|---|---|
$set | {$set:{field:value}} | 用于指定一个键值对,存在就修改,不存在就添加 | {$set:{name:”Leon”}} |
$inc | {$inc:{field:value}} | 只适用于数字类型的字段值修改,对指定字段进行增减指定数值 | {$inc:{age:1}} |
$unset | {$unset:{field:1}} | 删除指定的字段 | {$unset:{age:1}} |
$push | {$push:{field:value}} | 指定的字段必须是数组,否则中断,指定的字段不存在则创建 | {$push:{family:”brother”}} |
$pushAll | {$pushAll:{field:array}} | 要求同push,一次添加多个元素到数组 | {$pushAll:{family:[“father”,”mother”,”brother”]}} |
$addToSet | {$addToSet:{field:value}} | 将值插入匹配元素指定的数组中,如果该值已存在则不添加 | {$addToSet:{family:”sister”} |
$pop | {$pop:{field:value}} | 从指定字段中数组中删除一个值,value接受正数(最后一个)和负数(第一个),一般使用1和-1 | {$pop:{family:1}} |
$pull | $pull:{field:value} | 从指定字段中的数组中删除指定的一个值 | {$pull:{family:”father”}} |
$pullAll | {$pullAll:{field:array}} | 从指定字段中的数组中删除指定的所有值 | {$pullAll:{family:[“father”,”mother”]}} |
$ | 这是一个定位器非修改器,用于定位数组中的指定键 |
db.persons.update({_id:1},{$addToSet:{books:{$each:{"js","db"]}}})
$each会循环后面的数组把每一个数值进行$addToSet操作
当document被创建的时候DB为其分配内存和预留内存,当修改操作不超过预留内存的时候,则速度
非常快,反之,若超过了就要分配新的内存,从而消耗时间。
每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解
标签:i++ download writer tee 存在 支持 如何 数值 多个
原文地址:http://www.cnblogs.com/jiekzou/p/6977838.html