只要是数据库,那么就绝对离不开最为核心的功能:GRUD所以在 MongoDB 里面,对于数据的操作也是如此。
使用“db.集合.insert()”可以实现数据的增加操作。
范例: 增加一个文档
db.infos.insert({"url": "www.baidu.com"})
批量插入能传递一个由文档构成的数组给数据库。
范例: 批量插入文档
db.infos.insert([
{"url": "www.mldn.com"},
{"url": "www.mldnjava.cn"}
])
若要保存多个数组,那么就使用数组。
for(var x = 0; x < 10000; x++){
db.infos.insert({"url": "mldn-" + x});
}
若数据保存很多的情况下,列表时不会全部列出,它只会列出部分的内容。
注意:
1、一次发送数十、数百乃至数千个文档会明显提高插入的速度。
2、只有插入多个文档到一个集合时,批量插入才会有用。而不能用批量插入一次对多个文档到集合执行操作。
3、若要导入原始数据,可以使用命令行工具,如 mongoimport ,而不是使用批量插入。
使用“db.集合.remove()”可以实现数据的增加操作。
范例:清空 infos 集合中的内容
db.infos.remove({})
范例:删除所有学生姓名里面带有”谷“的信息,默认情况下,会全部删除。
db.students.remove({"name": /谷/})
范例:删除学生姓名带有”高“的信息,要求只删除一个
db.students.remove({"name": /高/}, true)
注意:
1、以上命令不会删除集合本身,原有的索引也会保留。
2、删除数据是永久性的,不能撤销,也不能恢复。
3、删除文档通常会很快,但是要清除整个集合,直接删除集合(然后重建索引)会更快。
使用“db.集合.update()”可以实现数据的增加操作。
update 有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档做哪些修改。
update 语法: db.集合.update(更新条件,新的对象数据(更新操作符),upsert, multi)
完整文档替换(该修改适用于模式结构发生了较大变化的时)
文档内部分替换
“$set
语法”:{“$set”: {“成员”: “新内容”}}
范例:将年龄是 20 岁的人的成绩修改为 89
db.students.update({"age": 20}, {"$set": {"score": 89}})
“$unset
” 语法:{“$unset”: {“成员”: 1}} // 删除某个成员的内容
范例:删除“张三”的年龄与成绩信息
db.students.update({"name": "张三"}, {"unset": {"age": 1, "score": 1}})
“$inc
” 语法:{“$inc”: {“成员”: “内容”}} //用来增加已有键的值,或者当键不存在时创建一个键
例子:将所有年龄为 19 岁的学生成绩一律减少 30 分
db.students.update({"age": 30}, {"$inc": {"score": -30}})
“$push
” 语法:{“$push”: {“成员”: “值”}} // 将内容追加到指定的成员之中
范例:向“张三”添加课程信息(此时张三信息下没有 course 信息)
db.students.update({"name": "李四"}, {"$push": {"course": "语文"}})
范例:向“谷大神 -E”里面的课程追加一个“美术”。
db.students.update({"name": "谷大神 -E"}, {"$push": {"course": "美术"}})
“$pushAll
” 语法: “$pushAll”: {“成员”: “数组内容”} // 与 “$push
” 是类似的,可以一次追加多个内容到数组里面
范例:向“王五”的信息里面添加多个课程内容
db.students.update({"name": "王五"}, {"$pushAll": {"course": ["美术", "音乐", "素描"]}})
“$addToSet
” 语法:{“$addToSet”: {“成员”: “内容”}} //向数组里面增加一个新的内容,只有这个内容不存在的时候,才会增加。
范例:向“王五”的信息增加新的内容
db.students.update({"name": "王五"}, {"$addToSet": {"course": "舞蹈"}})
“$pop
” 语法:{“$pop”: {“成员”: “内容”}} //删除数组内的数据。其中 ,若”内容” 设置为 -1,表示删除第一个;若”内容” 设置为 1,表示删除最后一个
范例:删除”王五“的第一个课程
db.students.update({"name": "王五"}, {"$pop": {"course": -1}})
范例:删除”王五“的最后一个课程
db.students.update({"name": "王五"}, {"$pop": {"course": 1}})
“$pull
” 语法:{“$pull”: {“成员”: “数据”}} //从数组内删除一个指定内容的数据
范例:删除”王五“学生的音乐课程信息
db.students.update({"name": "王五", {"$pull": {"course": "音乐"}}})
“$pullAll
“语法:{“$pull”: {“成员”: [“数据”, “数据”, …]}} // 一次性删除多个内容
范例:删除”谷大神 -A“中的三门课程
db.students.update({"name": "谷大神 -A"}, {"$pullAll": {"course": ["语文", "数学", "英语"]}})
“$rename
” 语法:{“$rename”: {“旧的成员名称”: “新的成员名称”}} //重命名成员名称
范例:将张三的 “name” 成员名称修改为”姓名“
db.students.update({"name": "张三"}, {"$rename": {"name": "姓名"}})
在任何的数据库之中,数据的查询操作都是最为麻烦的。
在 MongoDB 数据库中,对于查询的支持非常到位,包含有关系运算、逻辑运算、数组运算、正则运算等等。
查询操作语法: db.集合名称.find({查询条件} [, { 设置显示的字段 }])
范例:最简单的用法就是直接使用 find() 函数查询
db.infos.find()
范例:希望查询出 url 为“www.mldn.cn”的数据
db.infos.find({"url": "www.mldn.cn"});
数据的投影操作。
范例:不显示“_id”
db.infos.find({"url": "www.mldn.cn"}, {"_id": 0});
大部分的情况下,这种投影操作的意义不大。同时对于数据的查询也可以使用“pretty()函数”进行漂亮显示。
关系查询操作:大于($gt
)、小于($lt
)、大于等于($gte
)、小于等于($lte
)、不等于($ne
)、等于(key:value
)
范例:查询姓名是“张三”的学生信息
db.students.find({"name": "张三"});
范例:查询成绩大于等于 60 分的学生
db.students.find({"score": {"$gte": 60}});
其他的同上
逻辑运算主要就是三种类型:与($and
或者逗号)、或($or
)、非($not
、$nor
)
范例:查询年龄在 19~20 岁的学生信息
db.students.find({"age": {"$gte": 19, "$lte": 20}});
范例:查询年龄大于 19 岁,或者成绩大于 90 分的学生信息
db.students.find({"$or":[
{"age": {"$gt": 19}},
{"score": {"$gt": 90}}
]});
范例:也可以进行或的求反操作
db.students.find({"$nor":[
{"age": {"$gt": 19}},
{"score": {"$gt": 90}}
]});
在这几个逻辑运算之中,与的连接最简单的,而或的连接需要为数据设置数组的过滤条件。
模的运算使用 “$mod
” 来完成,其语法:“{$mod
: [数字, 小数位]}”
范例:求模
db.students.find({"age": {"$mod": [20, 1]}});
还可以通过求模计算编写一些数学的计算公式。
只要是数据库,必须存在有 “$in
“(在范围之中)、”$nin
“(不再范围之中)
范例:查询姓名是“张三”、“李四”、“王五”的信息
db.students.find({"name": {"$in": ["张三", "李四", "王五"]}});
范例:查询姓名不是“张三”、“李四”、“王五”的信息
db.students.find({"name": {"$nin": ["张三", "李四", "王五"]}});
数组查询运算符: $all
、$size
、$slice
、$elemMatch
各语法结果如下:
范例:保存一部分数组内容
db.students.insert({"name": "谷大神A","age":18, "course": ["语文", "数学", "音乐", "政治"]});
db.students.insert({"name": "谷大神A","age":19, "course": ["语文", "数学"]});
db.students.insert({"name": "谷大神A","age":20, "course": ["语文", "数学", "音乐"]});
db.students.insert({"name": "谷大神A","age":18, "course": ["语文", "数学", "政治"]});
db.students.insert({"name": "谷大神A","age":19, "course": ["语文", "音乐", "政治"]});
db.students.insert({"name": "谷大神A","age":18, "course": ["数学", "音乐", "政治"]});
范例:查询同时参加语文和数学课程的学生
db.students.find({"course": {"$all": ["语文", "数学"]}});
范例:查询数组中第二个内容(index = 1, 索引下标从 0 开始)为数学的信息
db.students.find({"course.1": "数学"});
范例:要求查询出只参加两门课程的学生
db.students.find({"course": {"$sieze": 2}});
范例:返回年龄为 19 岁的所有学生的信息,但要求只显示两门参加课程
db.students.find({"age": 19}, {"course": {"$slice": 2}}); //取得了前两门的信息
范例:返回年龄为 19 岁的所有学生的信息,但要求只显示最后两门参加课程
db.students.find({"age": 19}, {"course": {"$slice": -2}});
范例:取出中间部分的信息
db.students.find({"age": 19}, {"course": {"$slice": [1,2]}});
在 MongoDB 数据里面每一个集合数据可以继续保存其它的集合数据。
范例:有些学生需要保存家长信息。(如下就是嵌套的集合)
db.students.insert({
"name": "小王",
"sex": "男",
"parents": [
{"name": "小王父亲", "age": 50, "job": "工人"},
{"name": "小王母亲", "age": 46, "job": "务农"}
]
});
嵌套集合的数据判断只能够通过 “$elemMatch” 完成。
范例:查询出父母有人是工人的信息
db.students.find({
"$and": [
{"age": {"$gte": 19}},
{"parents": {
"$elemMatch": {"job": "局长"}
}}
]
});
“$exists” 可以判断某个字段是否存在
范例:查询具有 parents 成员的数据
db.students.find({"parents": {"$exists": true}});
范例:查询不具有 course 成员的数据
db.students.find({"course": {"$exists": false}});
因此,可用此类查询来进行一些不需要的数据的过滤。
“$where” 条件过滤
范例:使用 where 进行数据查询
db.students.find({"$where": "this.age>20"});
db.students.find("this.age>20");
对于 “$where” 是可以简化的,但是这类操作进行每一行的信息判断,实际上对于数据量较大的情况,并不便使用。实际上,以上的代码严格来讲是编写一个操作的函数。
db.students.find(function(){
return this.age>20;
});
以上只是查询了一个判断,若要实现多个条件的判断,那么就需要使用 “and” 连接。
db.students.find({"$and": [
{"$where": "this.age>19"},
{"$where": "this.age<21"}
]});
虽然这种形式的操作可以实现数据查询,但最大的缺点是将在 MongoDB 里面保存的 BSON 数据变为了 JavaScript 的语法结构,这样的方式不方便使用数据库索引机制。
若要实现模糊查询,必须使用正则表达式,而且正则表达式使用的是语言 Perl 兼容的正则表达式的形式。
正则表达式两种定义格式如下:
基础语法:{key: 正则标记}
完整语法:{key: {“$regex
“: 正则标记, “$options
“: 选项}}
范例:查询以“谷”开头的姓名
db.students.find({"name": /谷/});
范例:查询姓名有字母 “A”
db.students.find({"name": /a/i});
db.students.find({"name": {"`$regex`: /a/i"}})
在正则操作中,除了可以查询出单个字段的内容之外,也可以查询数组的数据
范例:查询数组数据中含有“语”
db.students.find({"course": /语?/});
db.students.find({"course":/语/});
数据的排序操作使用 sort() 函数,其有两个顺序:升序(1)降序(-1)
范例:数据降序
db.students.find().score({"score": -1});
自然排序:按照数据保存的先后顺序排序,使用 “$natural” 表示。
范例:自然排序
db.students.find().sort({"$natural": -1});
数据分页显示操作函数:
范例:分页显示 ( 第一页,skip(0)、limit(5) )
db.students.find().skip(0).limit(5).sort({"age": -1});
范例:分页显示 ( 第二页,skip(5)、limit(5) )
db.students.find().skip(5).limit(5).sort({"age": -1});
这两个分页的控制操作,就是在以后只要是存在有大数据的信息情况下都会使用它。