数据库 - MongoDB基础语法2
MongoDB 自带 JavaScript shell,允许使用命令行与 MongoDB 实例进行交互。shell 在很多场景中非常有用,包括执行管理功能、检查正在运行的实例或仅仅是探索 MongoDB。
本笔记根据《MongoDB权威指南(第3版)》整合而成
shell辅助函数对应的JavaScript函数
进入数据库
show dbs
use first
show collections
增
-
单条增加 insert
在 MongoDB 3.0 之前,insert 是在 MongoDB 中插入文档的主要方法。3.2 之后也支持,但是主要使用insertOne和insertManydb.test.insert({"second":"testtwo"})
-
单条增加 insertOne
tes={"3":3} db.test.insertOne(tes)
-
多条增加 insertMany
db.test.insertMany([{"third":"test3"},{"forth":"test4"},{"fifth":"test5"}])
1. 必须要用数组形式否则报错
2. insertMany默认是有序插入,当文档非法时,非法之前的文档可以正常插入,之后插入失败
3. insertMany用无序插入,则可以跳过非法文档
db.test.insertMany([{"_id":1,"dis":"one"},{"_id":2,"dis":"two"},{"_id":2,"dis":"three"},{"_id":4,"dis":"four"},{"_id":5,"dis":"five"}],{"ordered":false})
删
-
删除 remove
在 MongoDB 3.0 之前,remove 是在 MongoDB 中插入文档的主要方法。3.2 之后也支持,但是主要使用 deletetOne 和 deletetMany# 删除指定集合 db.test.remove({ "fifth" : "test5"})
# 删除所有集合 db.test.remove({})
1. 此命令会删除集合所有文档,但是不会删除集合本身,也不会删除集合的元信息
2. 删除数据是永久性的,不能撤销,也不能恢复
-
删除 deleteOne
db.test.deleteOne({"3" : 3})
-
删除 deleteMany
db.test.deleteMany({})
-
彻底删除集合
db.test.drop()
改
-
替换 replaceOne
db.test.replaceOne({ "_id" : 8},{"dis":"eight"})
牢记文档替换 eg: 更改上图中文档结构:把 "friends" 和 "enemies" 两个字段移到"relationships" 子文档中
var joe =db.test.findOne({"id":9}) joe.relationships ={"friend":joe.friends,"enemies":joe.enemies} delete joe.friends; delete joe.enemies; joe.name = joe.name joe.id = joe.id db.test.replaceOne({"id":9},joe)
replaceOne 同样将筛选文档作为第一个参数,但第二个参数是一个用来替换所匹配的筛选文档的新文档
-
更新 updateOne
db.test.updateOne({"dis" : "five"},{$set:{"dis" : "五"}})
-
更新 updateMany
db.test.updateMany({ "dis" : "two" },{$set:{"dis":"二"}}))
updateOne 和 updateMany 都将筛选文档作为第一个参数,将变更文档作为第二个参数,后者对要进行的更改进行描述。
-
使用更新运算符
更新运算符是特殊的键,可用于指定复杂的更新操作,比如更改、添加或删除键,甚至可以操作数组和内嵌文档。1. "$set"
用来设置一个字段的值。如果这个字段不存在,则创建该字段:db.test.updateOne({"id":9},{$set:{"hobbies":"reading"}})
也可以修改键的类型:
db.test.updateOne({"id":9},{$set:{"hobbies":["reading","swimming","running"]}})
修改内嵌文档:
db.test.updateOne({"id":9},{$set:{"relationships.enemies":0}})
2. "$unset"
删除某个键或者字段# 删除hobbies键 db.test.updateOne({"id":9},{$unset:{"hobbies":1}})
# 删除内嵌文档的键 db.test.updateOne({"id":9},{$unset:{"relationships.enemies":1}})
3. "$inc"
键不存在时,会创建:db.test.updateOne({"id":10},{$inc:{"score":50}})
递增操作和递减操作:
db.test.updateOne({"id":10},{$inc:{"score":1000}})
只能用于整型、长整型或双精度浮点型的值,否则报错
4. "数组运算符:$push"
如果数组不存在,则会创建一个新的数组:db.test.updateOne({"id":10},{$push:{"comments":{"num":1,"content":"第一"}}})
如果数组已存在,"$push" 就会将元素添加到数组末尾:
db.test.updateOne({"id":10},{$push:{"comments":{"num":2,"content":"第二"}}})
和$each连用,一次性批量添加:
db.test.updateOne({"id":10},{$push:{"comments":{$each:[{"num":3,"content":"第三"},{"num":4,"content":"第四"},{"num":5,"content":"第五"}]}}})
5. "数组运算符:$addToSet"
将数组视为集合,仅当一个值不存在时才进行添加
与$each 连用,只添加不存在的值
db.test.updateOne({"id":10},{$addToSet:{"marking":{$each:[{"Math":89},{"Chinese":98},{"Science":79}]}}})
6. "数组运算符:$pop"
如果将数组视为队列或者栈,那么可以使用 "$pop" 从任意一端删除元素
{"$pop" : {"key" : 1}} 会从数组末尾删除一个元素db.test.updateOne({"id":10},{$pop:{"comments":1}})
{"$pop" : {"key" : -1}} 会从数组头部删除一个元素
db.test.updateOne({"id":10},{$pop:{"comments":-1}})
6. "数组运算符:$pull"
用于删除与给定条件匹配的数组元素db.test.updateOne({"id":10},{$pull:{"comments" :{"num":3,"content":"第三"}}})
"$pull" 会删除所有匹配的文档,而不仅仅是一个匹配项
-
upsert
是一种特殊类型的更新。如果找不到与筛选条件相匹配的文档,则会以这个条件和更新文档为基础来创建一个新文档;如果找到了匹配的文档,则进行正常的更新。db.test.updateOne({"rep":20},{$inc:{"rep":2}},{upsert:true})
-
save 辅助函数
它可以在文档不存在时插入文档,在文档存在时更新文档。它只将一个文档作为其唯一的参数。如果文档中包含 "_id" 键,save 就会执行一个 upsert。否则,将执行插入操作。var x = db.test.findOne({"rep" : 22}) x.rep = 2 db.test.save(x)
查
使用 find 方法来进行查询。查询就是返回集合中文档的一个子集,子集的范围从 0 个文档到整个集合。要返回哪些文档由 find 的第一个参数决定,该参数是一个用于指定查询条件的文档。
# 如果 find 没有给定查询文档,则默认为 {}
db.user.find()
# 添加键–值查询
db.user.find({"age":16})
# 添加多个键–值查询
db.user.find({"age":16,"sex":"male"})
-
指定要返回的键
# 只返回,name和age键,_id键默认显示 db.user.find({},{"name":1,"age":1})
# _id键也不显示,只显示name和age键, db.user.find({},{"_id":0,"name":1,"age":1})
-
查询条件
1. 比较运算符:"$lt"、"$lte"、"$gt" 和 "$gte",即:<、<=、> 和 >=# 查询年龄>=15,<17 db.user.find({"age":{"$gte":15,"$lt":17}})
2. "$ne" ,即:不相等
#查询性别不为 male 的 db.user.find({"sex":{"$ne":"male"}})
3."$in"
可以用来查询一个键的多个值。db.user.find({"_id":{$in:[3,5,7]}})
4."$nin"
返回与数组中所有条件都不匹配的文档。db.user.find({"_id":{$nin:[3,5,7]}})
5."$or"
可以在多个键中查询任意的给定值。db.user.find({"$or":[{"age":15},{"name":"jack"}]})
6."$not"
可以用于任何其他条件之上。db.user.find({"age":{$not:{"$gte":15,"$lt":17}}})
-
特定类型的查询
1. null# 查询值为null的 db.user.find({"relations":null})
null 同样会匹配“不存在”这个条件,如图:
如果仅想匹配键值为 null 的文档,则需要检查该键的值是否为null,并且通过 "$exists" 条件确认该键已存在
db.user.find({"test":{$eq:null,$exists:true}})
-
数组类型的查询
1."$all"db.food.find({"fruit":{$all:["apple","banana"]}})
1."$size"
db.food.find({"fruit":{"$size":2}})
1."$slice"
# 查询fruit长度为13的数组中前六个值 db.food.find({"fruit":{$size:13}},{"fruit":{$slice:6}})
# 查询fruit长度为13的数组中后六个值 db.food.find({"fruit":{$size:13}},{"fruit":{$slice:-6}})
# 查询fruit长度为13的数组中第四个到第九个值 db.food.find({"fruit":{$size:13}},{"fruit":{$slice:[4,9]}})
-
查询内嵌文档
1. 点表示法db.user.find({"relations.friend":3})
2. "$elemMatch"
有如下文档> db.blog.find() { "content" : "...", "comments" : [ { "author" : "joe", "score" : 3, "comment" : "nice post" }, { "author" : "mary", "score" : 6, "comment" : "terrible post" } ] }
假设要找到 Joe 发表的 5分以上的评论。
# 错误,因为符合作者条件的评论与符合分数条件的评论可能不是同一条,如图所示: db.blog.find({"comments.author":"joe","comments.score":{$gte:5}})
要正确指定一组条件而无须指定每个键,请使用"$elemMatch"。这种模糊的命名条件允许你在查询条件中部分指定匹配数组中的单个内嵌文档。
db.blog.find({"comments":{$elemMatch:{"author":"joe","score":{$gte:5}}}})
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性