数据库基本操作
网易公开课-MongoDB数据库学习笔记
# use study,并不会创建数据库,只有在数据保存之后才会创建
>use study
# 创建集合
>db.createCollection("emp")
# 此时再次查看数据库,才会看到study已经创建
>show dbs
# 实际在使用的过程中,不会特意先创建集合,而是直接在集合中插入数据,mongodb会自动创建
>db.dept.insert({"deptno": 10, "dname": "财务部", "loc": "北京"})
# 此时MongoDB会自动创建一个dept的集合,并插入一条数据
# MongoDB数据库的集合结构很灵活,无模式集合。
# 查看集合内容
# 语法: db.集合名词.find({若干条件})
>db.dept.find()
{ "_id" : ObjectId("586a562f87e00ea77b041b67"), "deptno" : 10, "dname" : "财务部", "loc" : "北京" }
# ID "时间戳 + 机器码 + PID + 计数器",肯定不会重复
# 查找某个具体实例
>db.dept.find({"_id" : ObjectId("586a57b287e00ea77b041b69")})
>db.dept.findOne()
# 删除数据
# db.集合名词.remove({条件})
>db.dept.remove({"_id" : ObjectId("586a57b287e00ea77b041b69")})
# 更新数据
# db.集合名词.update({条件}, {更新后的数据})
>db.dept.update({"_id" : ObjectId("586a562f87e00ea77b041b67")}, {"loc": "上海"})
# 删除集合
# db.集合名词.drop()
db.dept.drop()
# 删除数据库(删除当前所在的数据库)
db.dropDatabase()
数据插入
# 增加单条数据
# db.集合.insert({数据json})
# 增加多条数据,数组形式
# db.集合.insert([{},{}])
# 批量数据javascript语法
for (var x = 0; x < 100; x ++) {
db.infos.insert({"url": "xxx" + x})
}
数据查询
# db.集合名词.find({查询条件},{显示字段})
# {查询条件},json格式
>db.infos.find({"url": "wwww.baidu.com"})
#{显示字段}:数据的投影操作,需要显示的字段设置为1,不显示的设置为0
>db.infos.find({},{"_id": 0})
# pretty显示,格式化的输出效果
db.infos.find({},{"_id": 0}).pretty()
数据集
# 测试数据集
>db.students.drop()
>db.students.insert({"name": "张三", "sex": "男", "age": 19, "score": 89, "address": "海淀区"})
>db.students.insert({"name": "李四", "sex": "女", "age": 20, "score": 59, "address": "朝阳区"})
>db.students.insert({"name": "王五", "sex": "女", "age": 19, "score": 99, "address": "西城区"})
>db.students.insert({"name": "赵六", "sex": "男", "age": 20, "score": 100, "address": "东城区"})
>db.students.insert({"name": "孙七", "sex": "男", "age": 19, "score": 20, "address": "海淀区"})
>db.students.insert({"name": "王八", "sex": "女", "age": 21, "score": 0, "address": "海淀区"})
>db.students.insert({"name": "刘九", "sex": "男", "age": 19, "score": 70, "address": "朝阳区"})
>db.students.insert({"name": "钱十", "sex": "女", "age": 21, "score": 56, "address": "西城区"})
>db.students.insert({"name": "数组-A", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["语文", "数学", "英语", "音乐", "政治"]})
>db.students.insert({"name": "数组-B", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["语文", "数学", "英语"]})
>db.students.insert({"name": "数组-C", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["语文", "政治"]})
>db.students.insert({"name": "数组-D", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["英语", "音乐", "政治"]})
>db.students.insert({"name": "嵌套-A", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["英语", "音乐", "政治"], "parents": [{"name": "父亲A", "job": "工人"}, {"name": "母亲A", "job": "员工"}]})
>db.students.insert({"name": "嵌套-B", "sex": "女", "age": 21, "score": 56, "address": "西城区", "course": ["英语", "音乐", "政治"], "parents": [{"name": "父亲B", "job": "局长"}, {"name": "母亲B", "job": "职员"}]})
关系运算
# 支持的关系操作 等于,大于($gt), 小于($lt),大于等于($gte),小于等于($lte),不等于($ne)
# 等于查询
>db.students.find({"name": "张三"}).pretty()
{
"_id" : ObjectId("586bbc0885913b9e29437679"),
"name" : "张三",
"sex" : "男",
"age" : 19,
"score" : 89,
"address" : "海淀区"
}
# 大于
>db.students.find({"age": {"$gt": 19}}).pretty()
# 大于等于
>db.students.find({"score": {"$gte": 60}}).pretty()
# 不等于
>db.students.find({"name": {"$ne":"张三"}}).pretty()
逻辑运算
# 支持的逻辑运算 与($and) 或($or) 非($nor)
# 与操作 and连接 查询19~20岁的学生
>db.students.find({"age": {"$gte": 19, "$lte": 20}}).pretty()
# 或 or
>db.students.find({"$or": [{"age": {"$gt": 19}}, {"score": {"$gt": 90}}]}).pretty()
# 非
>db.students.find({"$nor": [{"age": {"$gt": 19}}, {"score": {"$gt": 90}}]}).pretty()
求模运算
> db.students.find({"age": {"$mod" : [20, 1]}}).pretty()
{
"_id" : ObjectId("586bbc0885913b9e2943767e"),
"name" : "王八",
"sex" : "女",
"age" : 21,
"score" : 0,
"address" : "海淀区"
}
{
"_id" : ObjectId("586bbc0985913b9e29437680"),
"name" : "钱十",
"sex" : "女",
"age" : 21,
"score" : 56,
"address" : "西城区"
}
范围查询
# $in , $nin
>db.students.find({"name": {"$in": ["张三", "李四","王五"]}}).pretty()
>db.students.find({"name": {"$nin": ["张三", "李四","王五"]}}).pretty()
数组运算
# $all, $size, $slice, $elemMatch
# 所有学生信息里面,包含语文,数学
>db.students.find({"course": {"$all": ["语文", "数学"]}}).pretty()
>db.students.find({"address": {"$all": ["海淀区"]}}).pretty()
# 数组下标查询
>db.students.find({"course.1": "数学"}).pretty()
#只参加两门课程
>db.students.find({"course": {"$size": 2}}).pretty()
# 只显示前两门
>db.students.find({"age": 21}, {"course": {"$slice": 2}}).pretty()
>db.students.find({"age": 21}, {"course": {"$slice": -2}}).pretty()
# $slice: [start_index, length]
>db.students.find({"age": 21}, {"course": {"$slice": [1, 2]}}).pretty()
# 嵌套符合
>db.students.find({"$and": [{"age": {"$gt": 20}}, {"parents": {"$elemMatch": {"job": "局长"}}}]}).pretty()
是否存在
# exists, 数据过滤
> db.students.find({"parents": {"$exists": true}}).pretty()
条件过滤
# 能利用JavaScript,但是不方便使用索引
>db.students.find({"$where": "this.age > 20"}).pretty()
>db.students.find("this.age > 20").pretty()
>db.students.find(function() {return this.age > 20 && this.age <= 21}).pretty()
正则运算
#模糊查询,必须使用正则表达式
#Perl兼容的正则表达式
#{key: 正则标记}
# {key: {"$regex": 正则标记, "$options": 选项}},
# options: "i": 忽略字母大小写 "m" 多行查找 "x": 空白字符串除了被转义的或在字符串中意外的完全被忽略 "s": 匹配所有字符(圆点.),包括换行内容
>db.students.find({"name": /数组/}).pretty()
>db.students.find({"name": /a/i}).pretty() # 不区分大小写
>db.students.find({"name": {"$regex": /a/i}}).pretty()
>db.students.find({"course": /语/}).pretty()
数据排序
# sort()函数 升序(1) 降序(-1)
>db.students.find().sort({"score": 1}).pretty()
>db.students.find().sort({"score": -1}).pretty()
# nature 自然排序
>db.students.find().sort({"$nature": 1}).pretty()
数据分页
# skip(n)跨过多少数据
# limit(n)取多少数据
>db.students.find().skip(2).limit(5).pretty()
数据更新操作
# mongodb更新非常麻烦,最好的做法是:先删后重新插入
数据删除
# remove()函数
# db.集合.remove()
>db.students.remove({})
>db.students.remove({"name": /数组/})
>db.students.remove({"name": /数组/}, 1) # 只删除符合条件的1个
>db.students.drop() # 删除结婚
游标
# hasNext() next()
>var cursor = db.students.find()
>cursor.hasNext()
>cursor.next()
while(cursor.hasNext()) {
var doc = cursor.next()
printjson(doc)
}