MongoDB 增删改查

只要是数据库,那么就绝对离不开最为核心的功能: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()”可以实现数据的增加操作。

  • 删除条件:满足条件的数据被删除
  • 是否只删除一个数据。若设置为 true 或 1,则表示只删除一个。

范例:清空 infos 集合中的内容

db.infos.remove({})

范例:删除所有学生姓名里面带有”谷“的信息,默认情况下,会全部删除。

db.students.remove({"name": /谷/})

范例:删除学生姓名带有”高“的信息,要求只删除一个

db.students.remove({"name": /高/}, true)

注意:
1、以上命令不会删除集合本身,原有的索引也会保留。
2、删除数据是永久性的,不能撤销,也不能恢复。
3、删除文档通常会很快,但是要清除整个集合,直接删除集合(然后重建索引)会更快。


修改文档

使用“db.集合.update()”可以实现数据的增加操作。

update 有两个参数一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述对找到的文档做哪些修改。

update 语法: db.集合.update(更新条件,新的对象数据(更新操作符),upsert, multi)

  • upsert:若要更新的数据不存在,则增加一条内容(默认 true 为增加、false为不增加)
  • multi:表示是否更新满足条件的第一行。若设置为 false,只更新第一条;若设置为 true,全部更新。

完整文档替换(该修改适用于模式结构发生了较大变化的时)
文档内部分替换


修改器

$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"});

数据的投影操作

  • 若需要显示的字段,设置 “1”
  • 若不需要显示的字段,这是 “0”

范例:不显示“_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

各语法结果如下:

  • “{“$all”, [内容1, 内容2, …]}”
  • “{“$size”: 数字}” 用来进行查询结果数量的控制
  • “{“$slice”: 数字}” 用来对数组中的内容数量控制,类似于python的切片功能

范例:保存一部分数组内容

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” 可以判断某个字段是否存在

  • 若设置为 true,表示该字段存在
  • 若设置为 false,表示该字段不存在

范例:查询具有 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“: 选项}}

  • 对于 options 主要是设置正则的信息查询的标记
    • ”i”:忽略字母大小写
    • “m”:多行查找
    • “x”:空白字符串,除了被转义的活在或在字符类中意外的完全被忽略
    • “s”:匹配所有的字符(圆点、”.”),包括换行内容
  • 需要注意的是,若直接使用 javascript,那么只能够使用 “i” 和 “m”,而 “x” 和 “s” 必须使用 “$regex”。

范例:查询以“谷”开头的姓名

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(n):表示跨过多少数据行
  • limit(n):取出的数据行的个数限制

范例:分页显示 ( 第一页,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});

这两个分页的控制操作,就是在以后只要是存在有大数据的信息情况下都会使用它。

你可能感兴趣的:(MongoDB)