1.基础概念
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
2.数据库相关操作
- 查询所有数据库:
show dbs
- 创建数据库:
use DATABASE_NAME
,如果数据库不存在,则创建数据库,如果存在,则切换到指定数据库
创建完数据库后,这时候使用show dbs
,并不会显示,这时候需要向该数据库插入一条数据才会显示 - 删除数据库:
db.dropDatabase()
3.集合相关操作
- 查询所有集合:
show collections
- 创建集合:
db.createCollection(name, options)
例如:db.createCollection("my_test") - 删除集合:
db.collection.drop()
例如:db.my_test.drop()
4.文档相关操作
创建
-
db.collection.insertOne()
插入单个文档
例如:db.my_test.insertOne({"name":"孙悟空"}) -
db.collection.insertMany()
插入多个文档
例如:db.my_test.insertMany([ {"name":"孙悟空1"}, {"name":"孙悟空2"}])
查询
db.collection.find(query, projection)
- query:可选,查询条件
- projection:可选,返回文档中对应的键值,相当于select
案例:
db.my_test.find()
{ "_id" : ObjectId("5f03108f600de468908a8c11"), "name" : "孙悟空" }
{ "_id" : ObjectId("5f031095600de468908a8c12"), "name" : "孙悟空1" }
{ "_id" : ObjectId("5f031095600de468908a8c13"), "name" : "孙悟空2" }
db.my_test.find({"name" : "孙悟空1"})
{ "_id" : ObjectId("5f031095600de468908a8c12"), "name" : "孙悟空1" }
db.my_test.find({"_id" : ObjectId("5f031095600de468908a8c13")})
{ "_id" : ObjectId("5f031095600de468908a8c13"), "name" : "孙悟空2" }
db.my_test.find({"_id" : ObjectId("5f031095600de468908a8c13")},{"_id":0})
{"_id":0}
表示不显示_id
,1为显示
{ "name" : "孙悟空2" }
条件查询
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value>} |
db.my_test.find({"name":"孙悟空"}) | where name = '孙悟空' |
小于 | {<key>:{$lt:<value>}} |
db.my_test.find({"money":{$lt:50}}) | where money < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.my_test.find({"money":{$lte:50}}) | where money <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.my_test.find({"money":{$gt:50}}) | where money > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.my_test.find({"money":{$gte:50}}) | where money >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.my_test.find({"money":{$ne:50}}) | where money != 50 |
AND | {key1:value1, key2:value2} |
db.my_test.find({"name":"孙悟空"},{"age":{$gte:18}}) | where name = '孙悟空' and age >= 18 |
OR | $or: [ {key1: value1},{key2:value2} ] |
db.my_test.find( { $or: [{"name":"孙悟空"} , {"age":{$gte:18}]}) | where name = '孙悟空' or age >= 18 |
-
db.collection.find().limit(NUMBER)
获取记录条数
例如:db.my_test.find().limit(2) //获取查询出的两条记录 -
db.collection.find().skip(NUMBER)
跳过指定条数
例如:
db.my_test.find().skip(2) //获取查询出的数据,然后跳过两条记录
db.collection.find().skip(10).limit(10) //获取第11-20条记录 -
db.collection.find().sort({KEY:1})
按KEY进行排序,1是升序,-1是降序
更新
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
案例
db.my_test.update({"name":"孙悟空"},{"name":"孙悟空3"}) //直接将原文档替换
db.my_test.update({"name":"孙悟空"},{ $set:{"name":"孙悟空3"}}) //只替换name属性
db.my_test.update({"age":"18"},{ $set:{"age":"19"}},{multi:true}) // 如果有多条匹配的记录,全部修改
db.my_test.update({"age":"18"},{ $inc:{"age":1} },{multi:true}) // 如果有多条匹配的记录,全部修改,同时age+1
删除
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
案例
db.my_test.remove({"name":"孙悟空"}) //删除匹配的所有文档
db.my_test.remove({"name":"孙悟空"}, {justOne:true}) //只删除匹配的第一条
管道
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。类似于SQL的select
//只获取title ,author 字段
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
//只获取my_title字段,设置title为my_title
db.article.aggregate( { $project : { my_title : "$title" }} );
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。类似于SQL的where
db.article.aggregate( { $match: { title: "文章" }} );
- $limit:用来限制MongoDB聚合管道返回的文档数。
//获取得分大于70小于90的数据,再统计数量
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
{
user_id:A_id ,
bonus:[
{ type:a ,amount:1000 },
{ type:b ,amount:2000 },
{ type:b ,amount:3000 }
]
}
//unwind
db.user.aggregate([
{$unwind:bonus}
])
//结果
{user_id : A_id , bonus:{type : a ,amount : 1000}}
{user_id : A_id , bonus:{type : b ,amount : 2000}}
{user_id : A_id , bonus:{type : b ,amount : 3000}}
//统计
db.user.aggregate([
{$match: {user_id : A_id} },
{$unwind:bonus},
{$match: {'bonus.type' : b} },
{$group: {_id : '$user_id' , amount : {$sum : {'$bonus.amount'}} }}
])
//结果
{_id:A_id , amount : 5000}
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
聚合
db.collection.aggregate(AGGREGATE_OPERATION)
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.my_test.aggregate([{$group : {_id : "$user_id", num : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.my_test.aggregate([{$group : {_id : "$user_id", num : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值 | db.my_test.aggregate([{$group : {_id : "$user_id", num : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值 | db.my_test.aggregate([{$group : {_id : "$user_id", num : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.my_test.aggregate([$group : {_id : "$user_id", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.my_test.aggregate([{$group : {_id : "$user_id", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.my_test.aggregate([{$group : {_id : "$user_id", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.my_test.aggregate([{$group : {_id : "$user_id", last_url : {$last : "$url"}}}]) |
参考: