MongoDB

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"}}}])

参考:

  1. 菜鸟教程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343