跳到主要内容

MongoDB 基本用法

记得最早使用的数据库就是MongoDB,当时懵懂无知,就知道需要用一个数据库去储存数据,也分不清SQL 和 NoSQL。不过MongoDB以它的方便快捷吸引了我,以至于后来每次用MySQL的时候,还奇怪为啥每次都需要DDL定义结构,好麻烦。

P.S. 还记得学完MongoDB的那个晚上,黄昏🌆还是蛮好看的样子

安装教程

基础命令

参考教程推荐:CRUD Guides: Create, Read, Update, and Delete Data

数据库&集合

use test # 切换数据库
show dbs # 显示所有数据库
show collections # 显示所有collections

db.dropDatabase(test) # 删除数据库 test
db.createCollection(inventory) # 创建集合 inventory
db.inventory.drop() # 删除集合 inventory


mongo mongodb://$[hostlist]/$[database]?authSource=$[authSource] --username $[username] # 连接数据库

查询文档

# 查询全量数据
db.inventory.find({})

# 带Query的查询
db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )
db.inventory.find( { "size.uom": "in" } ) # 使用 dot notation

# 带比较运算符的查询
db.inventory.find( { "size.h": { $lt: 15 } } )

# 带And的查询
db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } ) # 显式写法
db.inventory.find( { price: { $ne: 1.99, $exists: true } } ) # 隐式写法

# 带Or的查询
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )


# 复杂查询
# AND 和 OR 一起使用
db.inventory.find( {
$and: [
{ $or: [ { qty: { $lt : 10 } }, { qty : { $gt: 50 } } ] },
{ $or: [ { sale: true }, { price : { $lt : 5 } } ] }
]
} )


db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] // qty小于30 或 item 以 p 开头
}

# 输出格式化
db.inventory.find({}).pretty()

# 查询字段是否存在
db.inventory.find({"price": {"$exists": true}}) # 筛选出 price 字段存在的记录

插入文档

# use test
# 将数据插入collections:inventory,此时会创建test数据库
# 插入一条数据
db.inventory.insertOne(
{ "item" : "canvas",
"qty" : 100,
"tags" : ["cotton"],
"size" : { "h" : 28, "w" : 35.5, "uom" : "cm" }
}
)

# 批量插入数据
db.inventory.insertMany( [
{ "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
{ "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
{ "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
{ "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
{ "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);

更新文档

# 更新
# 更新一条
db.inventory.updateOne(
{ "item" : "paper" }, // specifies the document to update
{
$set: { "size.uom" : "cm", "status" : "P" },
$currentDate: { "lastModified": true }
}
)

# 更新多条
db.inventory.updateMany(
{ "qty" : { $lt: 50 } }, // specifies the documents to update
{
$set: { "size.uom" : "cm", "status": "P" },
$currentDate : { "lastModified": true }
}
)

删除文档

# 删除一条
db.inventory.deleteOne(
{ "status": "D" } // specifies the document to delete
)
# 删除多条
db.inventory.deleteMany(
{ "status" : "A" } // specifies the documents to delete
)

删除字段

db.inventory.update({"price": {"$lt": 3}}, {"$unset": {"discount":1}}, {multi: true}) # 价格低于3元,取消打折。multi设置为true删除多条记录。

补充