MongoDB 文档数据库的 SQL 有异于我们熟知的关系型数据库(MySQL)的 SQL。
use test
use test
show dbs
db
db
可以看成是当前数据库的引用,后续的集合(表)、文档(数据)的操作会通过它来。# 先选择想要删除的数据库:test。
use test
# 再执行删除数据库的命令。
db.dropDatabase()
show tables
show collections
db.<collection_name>.drop()
db.test.drop()
db.test.insertOne({...})
开始操作文档(数据、记录)需要明确 MongoDB 的 SQL 和 MySQL 这类的关系型数据的 SQL 不一样了。
例如 MySQL 的 SQL 查询满足条件 age = 10
的数据。
SELECT field_a, field_b FROM table_a WHERE age = 10
但是 MongoDB 的 SQL 查询就是这样的。
{
"age": {
$eq: 10
}
}
更新、聚合或者删除等操作也是类似的 SQL 结构。
$set
{ $set: { <newField>: <expression>, ... } }
$unset
$unset
,也不使用 $set
,将会认为更新后的数据不包含该字段,所以这些字段会被更新操作所覆盖删除。{ $unset: "<field1>" }
{ $unset: [ "<field1>", "<field2>", ... ] }
$rename
$push
{ $push: { <field>: <value>, ... }}
$pop
{ $pop: { <field>: <-1 | 1>, ... }}
-1
表示移除数组的第一个。1
表示移除数组最后一个。$pull
{ $pull: { <field>: <value>, ... }}
c
。["a", "b", "c", "c"]
--> pull "c"
--> ["a", "b"]
$pullAll
{ $pull: { <field>: [<value>], ... }}
c
和 b
。["a", "b", "c", "c"]
--> pull ["c", "b"]
--> ["a"]
$addToSet
{ $addToSet: { <field>: <value>, ... }}
$and
AND
{$and: [{<expression>}, {<expression>}]}
$not
!=
{$not: {<expression>}}
$or
OR
{$or: [{<expression>}, {<expression>}]}
$nor
$eq
{<field>: {$eq: <value>}}
$gt
{<field>: {$gt: <value>}}
$gte
{<field>: {$gte: <value>}}
$in
{<field>: {$in: [<value>, ...]}}
$lt
{<field>: {$lt: <value>}}
$lte
{<field>: {$lte: <value>}}
$ne
{<field>: {$ne: <value>}}
$nin
{<field>: {$nin: [<value>, ...]}}
$elemMatch
{<field>: {$elemMatch: { <query1>, <query2>, ...}}}
$size
{field: {$size: size}}
添加文档
_id
db.<collection_name>.insert(<document or array of documents>, {writeConcern: <document>, ordered: <boolean>})
db.<collection_name>.insertOne(<json_string>)
db.<collection_name>.insertMany([<json_string>, ...])
# 添加数据
db.test.insert({...})
db.test.insert([{...}, {...}])
# 添加一条
db.test.insertOne({...})
# 添加多条
db.test.insertMany([{...}, {...}])
更新文档
{
# true:等同于 updateMany()
# false:只更新命中的第一条(默认值)
upsert: <boolean>,
writeConcern: <document>,
# 指定排序规则
collation: <document>,
# 更新数组的筛选条件
arrayFilters: [ <filterdocument1>, ... ],
# 选择索引
hint: <document|string>
}
################################ arrayFilters 例子 ################################
# 数据如下
# {"_id": 1, "grades": [ 95, 92, 90]}
# {"_id": 2, "grades": [ 98, 100, 102]}
# {"_id": 3, "grades": [ 95, 110, 100]}
# 将 grades 数组中大于等于 100 的值更新为 100
db.students.updateMany(
{ grades: { $gte: 100 } },
{ $set: { "grades.$[element]" : 100 } },
{ arrayFilters: [ { "element": { $gte: 100 } } ] }
)
db.<collection_name>.update(query, update, options)
db.<collection_name>.updateOne(query, update, options)
db.<collection_name>.updateMany(query, update, options)
db.test.update({"age": 10},{$set: {"name": "update name"}})
# 只更新命中的第一条数据
db.test.updateOne({"age": 10},{$set: {"name": "updateOne"}})
# 更新数据,根据 age = 10 的条件,更新 name = "new name"
db.test.updateMany({"age": 10},{$set: {"name": "new name"}})
查询文档
db.<collection_name>.find(query)
db.<collection_name>.findOne(query)
db.<collection_name>.find(query).skip(offSet).limit(size)
db.<collection_name>.find(query).sort({name: 1})
# 查看所有
db.test.find()
# 分页
db.test.find().skip(1).limit(1)
# 根据条件做查询,查询条件为 age = 10
db.test.find({"age": {$eq: 10}})
# 随便返回一个文档
db.test.findOne()
# 根据条件命中
db.test.findOne({"age": {$eq: 10}})
# 某个字段存在
db.test.find({"score": {$exists: true}})
删除文档
db.<collection_name>.deleteOne(filter, options)
db.<collection_name>.deleteMany(filter, options)
# 删除匹配中的一个
db.test.deleteOne({"age": {$eq: 10}})
# 删除所有
db.test.deleteMany({})
# 删除所有匹配中的
db.test.deleteMany({"age": {$eq: 10}})