mongodb学习记录
mongo
show dbs查看所有的数据库
使用use可以切换数据库,如果没有数据库则创建一个新的
use local切换倒local数据库
增加数据
db.test.insert({name:"jack"})向test表中插入一条数据,如果没有test表则创建一个,如果传入一个文档数组则会批量插入。
批量插入
db.test.batchInsert([{"_id":0, "_id":1}])接受一个文档数组作为参数,如果插入过程中有个文档插入失败,该文档之前的都会成功插入,该文档和之后的文档则不会插入。
3.4之后改成了
db.test.insertMany()
删除数据
db.test.remove({name:"jack"})删除test表中所有name为jack的数据
查找数据
db.test.find()查看test表中所有数据等价于db.test.find({})
db.test.findOne()查看一条数据
使用查询操作符指定条件
db.test.find({ name: { $in: ["jack", "alice"]}})查找name为jack和alice的所有数据
db.test.find({ name: "jack", age: { $lt: 20}})查找name为jack并且age小于20
嵌入文档的查询
db.test.find({ favorites: { book: "python", food: "pizza"}})查询test表中favorites字段中book为python并且food为pizza的数据
db.test.find({"favorites.book":"python"})
数组上的查询
db.test.find({ family: [ "father", "mather"]})查询所有family字段有且只有两个元素father,mather的数据
db.test.find({ family: "fahter"})查询所有family字段中包含father的数据
db.test.find({ "family.0": "father" })查询所有family字段中首个元素为fahter的数据
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )查询 finished 数组至少包含一个大于 ($gt) 15 并且小于 ($lt) 20 的元素的文档
db.users.find( { finished: { $gt: 15, $lt: 20 } } )查询 finished 数组包含以某种组合满足查询条件的元素的文档;例如,一个元素满足大于 15 的条件并且有另一个元素满足小于 20 的条件,或者有一个元素满足了这两个条件
嵌入文档数组
db.users.find( { 'points.0.points': { $lte: 55 } } )查询使用 the dot notation 匹配所有 dadges 是第一个元素为``”black”`` 的数组的文档:如果你知道内嵌文档的数组索引,你可以使用 dot notation 及内嵌文档的位置指定文档
db.users.find( { 'points.points': { $lte: 55 } } )选择出所有 points``数组中至少有一个嵌入文档包含值小于或等于 ``55 的字段 points 的文档:
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )查询 points 数组有至少一个包含 points 小于等于 70 并且字段 bonus 等于 20 的内嵌文档的文档
db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )查询了 points 数组包含了以某种组合满足查询条件的元素的文档;例如,一个元素满足 points 小于等于 70 的条件并且有另一个元素满足 bonus 等于 20 的条件,或者一个元素同时满足两个条件
$lt 小于(less then)
$lte 小于等于(less then equal)
$gt 大于(great then)
$gte 大于等于(great then equal)
修改数据
db.test.update({name:"jack"}, {name:"mike"})将test表中name为jack的数据改为name等于mike,如果jack里面有其他的字段会全部被删除,如果不想删除,可以使用下面的命令
1.$inc
用法:{$inc:{field:value}}
作用:对一个数字字段的某个field增加value
示例:将name为chenzhou的学生的age增加5
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 22 }
- #查询结果显示年龄为22
- > db.students.update({name:"chenzhou"},{$inc:{age:5}})
- #执行修改,把age增加5
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- >
- #查询结果显示年龄为27,修改成功
2.$set
用法:{$set:{field:value}}
作用:把文档中某个字段field的值设为value
示例: 把chenzhou的年龄设为23岁
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 27 }
- > db.students.update({name:"chenzhou"},{$set:{age:23}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- >
从结果可以看到,更新后年龄从27变成了23
3.$unset
用法:{$unset:{field:1}}
作用:删除某个字段field
示例: 将chenzhou的年龄字段删除
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou", "age" : 23 }
- > db.students.update({name:"chenzhou"},{$unset:{age:1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- >
4.$push
用法:{$push:{field:value}}
作用:把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型
示例:给chenzhou添加别名"michael"
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$push:{"ailas":"Michael"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- >
由结果可以看到,记录中追加了一个数组类型字段alias,且字段有一个为"Michael"的值
5.pushAll
用法:{$pushAll:{field:value_array}}
作用:用法同$push一样,只是$pushAll可以一次追加多个值到一个数组字段内。
示例:给chenzhou追加别名A1,A2
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pushAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- >
6.$addToSet
用法:{$addToSet:{field:value}}
作用:加一个值到数组内,而且只有当这个值在数组中不存在时才增加。
示例:往chenzhou的别名字段里添加两个别名A3、A4
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$addToSet:{"ailas":["A3","A4"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由结果可以看出,更新后ailas字段里多了一个对象,这个对象里包含2个数据,分别是A3、A4
7.$pop
用法:删除数组内第一个值:{$pop:{field:-1}}、删除数组内最后一个值:{$pop:{field:1}}
作用:用于删除数组内的一个值
示例: 删除chenzhou记录中alias字段中第一个别名
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "Michael", "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":-1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- >
由结果可以看书,第一个别名Michael已经被删除了。
我们再使用命令删除最后一个别名:
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2", [ "A3", "A4" ] ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pop:{"ailas":1}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- >
由结果可以看出,alias字段中最后一个别名["A3","A4"]被删除了。
8.$pull
用法:{$pull:{field:_value}}
作用:从数组field内删除一个等于_value的值
示例:删除chenzhou记录中的别名A1
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pull:{"ailas":"A1"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A2" ], "name" : "chenzhou" }
- >
9.$pullAll
用法:{$pullAll:value_array}
作用:用法同$pull一样,可以一次性删除数组内的多个值。
示例: 删除chenzhou记录内的所有别名
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ "A1", "A2" ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$pullAll:{"ailas":["A1","A2"]}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- >
可以看到A1和A2已经全部被删除了
10.$rename
用法:{$rename:{old_field_name:new_field_name}}
作用:对字段进行重命名
示例:把chenzhou记录的name字段重命名为sname
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "name" : "chenzhou" }
- > db.students.update({name:"chenzhou"},{$rename:{"name":"sname"}})
- > db.students.find()
- { "_id" : ObjectId("5030f7ac721e16c4ab180cdb"), "ailas" : [ ], "sname" : "chenzhou" }
- >
由结果可以看出name字段已经被更新为sname了。
参考自http://chenzhou123520.iteye.com/blog/1637629
db.test.save({name:"alice"})如果没有该数据则创建一个新的数据,有的话就更新
linux中在当前用户的主目录下(/home/xxx)创建一个.mongorc.js
mongo运行shell之前会加载该文件
可以在文件中重写删除操作来避免删除数据
可以指定EDITOR="/usr/bin/vim"之后就可以edit编辑shell中的变量了
在shell中可以用for循环来遍历数据
var collections = ["a", "b", "c"] for (var i in collections){ print(collections[i]) }
db.createCollection( "contacts", { validator: { $or: [ { phone: { $type: "string" } }, { email: { $regex: /@mongodb\.com$/ } }, { status: { $in: [ "Unknown", "Incomplete" ] } } ] } } )
使用validator来验证字段是否满足要求
db.runCommand( { collMod: "contacts", validator: { $or: [ { phone: { $exists: true } }, { email: { $exists: true } } ] }, validationLevel: "moderate" } )
用runCommand来修改集合中字段的验证
更多内容请查看官方文档地址http://docs.mongoing.com/manual-zh/mongo.html