MongoDb 基础命令
Tip
参考:
- mongo Shell Quick Reference
- Working with the mongo Shell
- MongoDB Cheat Sheet
- MongoDB 入门 | 小马技术
- MongoDB Crash Course | Traversy Media
可以使用 GUI 界面 MongoDB Compass 来操作数据库;但 :thumbsup: 推荐使用命令行界面 mongo shell 来进行更高效的操作,可使用的详细命令参考官方文档 mongo Shell Methods。
Tip
可以使用链式来组合不同的命令构成复杂的查询语句,如 db.posts.find().limit(2).sort({ title: 1 }).pretty()
以上链式查询语句中各方法的作用:
db.posts.find()
查询当前数据库db
的集合posts
中所有的文档.limit(2)
限制最多打印前 2 个文档.sort({ title: 1 })
输出的文档基于其中的title
域升序排列.pretty()
以更易于阅读的方式打印文档内容
帮助命令
help
列出帮助相关的命令db.help()
列出 database 可用的方法和帮助信息db.<collection>.help()
列出集合可用的方法
用户
show users
列出当前数据库所有用户
数据库
show dbs
查看所有数据库db
查看当前数据库db.stats()
查看当前数据库的信息概述use <DatabaseName>
切换到指定的数据库,如果没有就会以该名创建一个db.dropDatabase()
删除当前数据库
集合
show collections
列出当前数据库的所有集合db.createCollection(CollectionName)
创建一个新的集合,名为CollectionName
db.<CollectionName>.renameCollection(NewCollectionName)
将集合CollectionName
改名为NewCollectionName
db.<CollectionName>.drop()
删除集合
文档
插入与更新
db.<CollectionName>.insert(<document[s]>)
向集合插入文档,Tip
相当于
.insertOne()
(或文档组成的数组,相当于.insertMany()
)bashdb.posts.insert( { title: "我的第一篇博客", content: "已经开始写博客了,太激动了。", date: Date() } );
Tip
可以使用 JavaScript 语法,如 for 循环实现插入多个文档
bashfor(var i = 3; i <=10; i++ ) { db.posts.insert({ title: "我的第" + i + "篇博客" }); }
Tip
使用 JavaScript 语法(内置对象)
Date()
可以获取当前时间db.<CollectionName>.insertOne(<document>)
向集合插入一个文档db.<CollectionName>.insertMany(<documents>)
向集合插入多个文档(以对象数组形式传递)db.<CollectionName>.update(<query>, <update>, <setting>)
更新匹配的文档
使用特殊的命令来更新字段$set
更新或新增字段值,默认以覆写的方式来更新第一个匹配的文档,如果希望更新部分字段,可以使用$set
命令db.posts.update({"title":"test"}, {$set: {"rank": 10} })
更新排名字段为10
,其他字段不变unset
删除匹配文档的指定字段db.posts.update({"title":"test"}, {$unset: {"rank": true} })
$inc
表示递增 incrementdb.posts.update({title:"test"}, {$inc: {rank: 2}})
将匹配文档的排名字段的值递增2
$mul
表示相乘 multipledb.posts.update({title:"test"}, {$mul: {rank: 2}})
将匹配文档的排名字段的值乘以2
$rename
重命名字段db.posts.update({title:"test"}, {$rename: {"rank": "score"}})
将字段rank
重命名为score
Tip
可以传递一个对象作为第三个参数(可选)进行更详细的更新行为配置
js{ upsert: <boolean>, multi: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2 }
如设置命令
upsert: true
在未匹配到文档时,基于<update>
创建一个新文档,即将 update 和 insert 功能结合起来;默认只会更新第一个匹配的文档,可以设置命令multi: true
更新所有匹配的文档。
查询
db.<CollectionName>.find({key: 'value'})
查看集合符合条件的文档,如果参数为空对象{}
则返回所有文档Tip
可以使用
db.<CollectionName>.find().pretty()
以更易于阅读的排版方式打印出文档内容
可以在设置更复杂的匹配条件- 使用
$gte
大于等于,$gt
大于,$lte
小于等于,$lt
小于,$eq
等于,$ne
不等于设置查询范围db.posts.find({"rank": {$gte: 4}})
查询排名大于等于4
的文档 - 使用正则表达式
/reg/
设置需要匹配的模式db.posts.find({"title": /u/})
查询标题中包含u
的文档 - 使用
$or
或,$in
包含,$exists
存在(一般针对该域/字段是否存在文档中)db.posts.find({"rank": {$in: [3, 4]} })
查询排名为3
或4
的文档db.posts.find({$or: [{"title": /u/}, {"rank":{$gte:4}}] })
查询满足两个条件之一的文档db.bios.find(death: {$exists: false }})
查询仍运行的 bios 程序 - 使用
$elemMatch
查询字段值为对象数组的嵌套型的数据结构,匹配数组对象中属性值为特定值的文档 - 使用
$all
操作符查询字段值为数组且包含所有指定的元素,类似于$and
操作符
Tip
可以传递第二个参数(可选)
db.collection.find(<query>, <projection>)
设置抽取文档要返回的部分域/字段),需要返回的字段需要显示地设置为true
或1
否则默认不返回(除了_id
字段,它是默认打印的)db.posts.find({}, {title:true, rank:1, _id:0})
返回所有文档的title
和rank
字段,但不输出_id
字段(默认会打印)- 使用
db.<CollectionName>.find().sort({key: 1})
将查询得到的文档以给定字段升序排列,如果需要降序排列可以设置为key: -1
db.<CollectionName>.find().limit(n)
只输出查询得到的前n
个文档db.<CollectionName>.find().skip()
跳过查询得到的前n
个文档,结合.limit()
可以实现分页查询db.<CollectionName>.findOne({key: 'value'})
按照条件查询集合第一个匹配的文档
索引
给文档建立索引可以便于搜寻,MongoDB 默认使用软件给每个文档生成的 _id
作为索引。
db.<CollectionName>.getIndexes()
获取集合中文档的所有索引db.<CollectionName>.createIndex({rank:-1})
添加以排名作为索引,顺序为降序排列,如果需要索引值唯一可以设置参数db.<CollectionName>.createIndex({rank:-1}, {unique: true})
db.<CollectionName>.dropIndex({rank: -1})
删除索引,需要传递与创建索引时相同的名称
基于索引进行搜索
基于字段 title
创建索引,格式是文本
db.posts.createIndex({ title: 'text' })
db.posts.find({
$text: {
$search: "\"Post O\""
}
})
# 返回 title 包含 Post O 的文档
db.posts.find({
$text: {
$search: "\"Post T\""
}
})
# 返回 title 包含 Post T 的文档
其他
db.<CollectionName>.count()
查看集合所包含的文档数量db.<CollectionName>.distinct(key)
查看集合指定域/字段的所有(非重复)值,返回一个数组db.<CollectionName>.remove({key: 'value'})
删除集合匹配的文档,如果参数为空对象{}
则删除集合中所有的文档.forEach(function() {})
循环遍历元素bashdb.posts.find().forEach(function(doc) { print("Blog Post: " + doc.title) })