MongoDB 增删改查

一、数据库操作

1、增

  • use config
    //如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库。

2、查

  • show dbs
    //查看所有数据库,相当于Mysql的show databases
    空数据库不会显示在列表中比如默认创建的数据库config, 要显示,就必须在库中插入数据
  • db
    //查看当前所在库

3、删

  • db.dropDatabase()

实例:删除数据库 runoob。
1.首先,查看所有数据库:

> show dbs
local   0.078GB
runoob  0.078GB
test    0.078GB

2.切换到数据库 runoob:

> use runoob
switched to db runoob

3.执行删除命令:

> db.dropDatabase()
{ "dropped" : "runoob", "ok" : 1 }

4.通过 show dbs 命令数据库查看是否删除成功:

> show dbs
local  0.078GB
test   0.078GB

二、集合操作(table)

1、增

方式一:

  • db.table1.insert({'a':1})
    //当第一个文档插入时,集合就会被创建并包含该文档

方式二:

  • db.table2
    //创建一个空集合

2、查

//显示数据库中所有的集合(collection)

  • show collections
  • show tables

3、删

  • db.table1.drop()

集合没有改的操作


三、文档操作

文档的操作可以看成是对字典的操作

1、增

增加时没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变

  • 单条增加
    往学生表中插入一条数据
student1={
    "name":"Marry",
    "age":10,
    'hobbies':['music','read','dancing']
}

db.Student.insert(student1)
  • 多条批量增加:db.Student.insertMany([ , , , , ,])的形式
student1={
    "_id":1,
    "name":"alex",
    "age":10,
    'hobbies':['music','read','dancing']
}

student2={
    "_id":2,
    "name":"wupeiqi",
    "age":20,
    'hobbies':['music','read','run']
}

student3={
    "_id":3,
    "name":"yuanhao",
    "age":30,
    'hobbies':['music','drink']
}

student4={
    "_id":4,
    "name":"jingliyang",
    "age":40,
    'hobbies':['music','read','dancing','tea']
}

student5={
    "_id":5,
    "name":"jinxin",
    "age":50,
    'hobbies':['music','read']
}

db.Student.insertMany([student1,student2,student3,student4,student5])

2.删

  • 1、删除符合条件的第一个文档
db.user.deleteOne({ 'age': 8 })
//第一个包含有 'age': 8的文档
  • 2、删除符合条件的全部
db.user.deleteMany( {'addr.country': 'China'} )
//只要有内嵌文档,且内容含有country': 'China'的全都删除
db.user.deleteMany({"_id":{"$gte":3}})
//删除id大于等于3的所有
  • 3、删除全部
db.user.deleteMany({}) 
//等于是清空该集合(表)

3.查

查的形式有很多,如比较运算、逻辑运算、成员运算、取指定字段、对数组的查询、使用正则、获取数量,还有排序、分页等等。下面我们针对十种查的形式进行详细说明。
注:在MongoDB中,用到方法都得用 $ 符号开头

一、比较运算:=,!= ('ne') ,> ('gt') ,< ('lt') ,>= ('gte') ,<= ('$lte')
//1、select * from db1.user where id = 3
db.user.find({"_id":3})

//2、select * from db1.user where id != 3
db.user.find({"_id":{"$ne":3}})

//3、select * from db1.user where id > 3
db.user.find({"_id":{"$gt":3}})

//4、select * from db1.user where age < 3
db.user.find({"age":{"$lt":3}})

//5、select * from db1.user where id >= 3
db.user.find({"_id":{"$gte":3}})

//6、select * from db1.user where id <= 3
db.user.find({"_id":{"$lte":3}})
二、逻辑运算:MongoDB中字典内用逗号分隔多个条件是and关系,或者直接用and,o,r$not(与或非)
///逻辑运算:$and,$or,$not
//1 select * from db1.user where id >=3 and id <=4;
db.user.find({"_id":{"$gte":3,"$lte":4}})

//2 select * from db1.user where id >=3 and id <=4 and age >=40;
db.user.find({
    "_id":{"$gte":3,"$lte":4},
    "age":{"$gte":40}
})

db.user.find({"$and":[
{"_id":{"$gte":3,"$lte":4}},
{"age":{"$gte":40}}
]})


//3 select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao";
db.user.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"yuanhao"}
]})

//4 select * from db1.user where id % 2 = 1;
db.user.find({"_id":{"$mod":[2,1]}})

db.user.find({
    "_id":{"$not":{"$mod":[2,1]}}
})
三、成员运算:成员运算无非in和not in,MongoDB中形式为in ,nin
//1、select * from db1.user where age in (20,30,31);
db.user.find({"age":{"$in":[20,30,31]}}) 

//2、select * from db1.user where name not in ('alex','yuanhao');
db.user.find({"name":{"$nin":['Stefan','Damon']}})
四、正则:正则定义在/ /内
//1、select * from db1.user where name regexp '^j.*?(g|n)$';
db.user.find({'name':/^j.*?(g|n)$/i})
//匹配规则:j开头、g或n结尾,不区分大小写
五、查看指定字段:0表示不显示1表示显示
//1、select name,age from db1.user where id=3;
db.user.find({'_id':3},{'_id':0,'name':1,'age':1})

//2、select name,age from db1.user where name regexp "^jin.*?(g|n)$";
db.user.find({
    "name":/^jin.*?(g|n)$/i
},
{
    "_id":0,
    "name":1,
    "age":1
}
)
六、对数组的查询:
//查hobbies中有dancing的人
db.user.find({
    "hobbies":"dancing"
})
//查看既有dancing爱好又有tea爱好的人
db.user.find({
    "hobbies":{"$all":["dancing","tea"]}
})
//查看第2个爱好为dancing的人
db.user.find({
    "hobbies.2":"dancing"
})
//查看所有人的第2个到第3个爱好
db.user.find(
{},
{
    "_id":0,
    "name":0,
    "age":0,
    "addr":0,
    "hobbies":{"$slice":[1,2]},
}
)

//查看所有人最后两个爱好,第一个{}表示查询条件为所有,第二个是显示条件
db.user.find(
{},
{
    "_id":0,
    "name":0,
    "age":0,
    "addr":0,
    "hobbies":{"$slice":-2},
}
)

//查询子文档有"country":"China"的人
db.user.find(
{
    "addr.country":"China"
}
)
七、对查询结果进行排序:sort() 1代表升序、-1代表降序
db.user.find().sort({"name":1,})
db.user.find().sort({"age":-1,'_id':1})
八、分页:limit表示取多少个document,skip代表跳过几个document

这样就做到了分页的效果

db.user.find().limit(2).skip(0)#前两个
db.user.find().limit(2).skip(2)#第三个和第四个
db.user.find().limit(2).skip(4)#第五个和第六个
九、获取数量:count()
//查询年龄大于30的人数
//方式一:
db.user.count({'age':{"$gt":30}}) 

//方式二:
db.user.find({'age':{"$gt":30}}).count()
十、其他:查找所有、去重、查找key为null的项
//1、查找所有
db.user.find() #等同于db.user.find({})
db.user.find().pretty() #2、去重
db.user.find().distinct() #3、{'key':null} 匹配key的值为null或者没有这个key
db.t2.insert({'a':10,'b':111})
db.t2.insert({'a':20})
db.t2.insert({'b':null})
db.t2.find({"b":null})#得到的是b这个key的值为null和没有b这个key的文档
{ "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 }
{ "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null }</pre>

4.改Update

update() 方法用于更新已存在的文档。语法格式如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18;

  • query : 相当于where条件。
  • update : update的对象和一些更新的操作符(如,inc...等,相当于set后面的
  • upsert : 可选,默认为false,代表如果不存在update的记录则不更新也不插入,设置为true代表不存在则添加。
  • multi : 可选,默认为false,代表只更新找到的第一条记录,设为true时,代表更新找到的全部记录。
  • writeConcern :可选,抛出异常的级别。

更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。

1、常规修改操作:

设数据为{'name':'武松','age':18,'hobbies':['做煎饼','吃煎饼','卖煎饼'],'addr':{'country':'song','province':'shandong'}}
update db1.user set age=23,name="武大郎" where name="武松";

#1、覆盖式
db.user.update(
    {"name":"武松"},
    {"age":23,"name":"武大郎"}
)
#得到的结果为{"age":23,"name":"武大郎"}

#2、局部修改:$set
db.user.update(
    {"name":"武松"},
    {"$set":{"age":15,"name":"潘金莲"}}
)
#得到的结果为{"name":"潘金莲","age":15,'hobbies':['做煎饼','吃煎饼','卖煎饼']}

#3、改多条:将multi参数设为true
db.user.update(
    {"_id":{"$gte":1,"$lte":2}},
    {"$set":{"age":53,}},
    {"multi":true}
)
#4、有则修改,无则添加:upsert参数设为true
db.user.update(
    {"name":"EGON"},
    {"$set":{"name":"EGON","age":28,}},
    {"multi":true,"upsert":true}
)

#5、修改嵌套文档:将国家改为日本
db.user.update(
    {"name":"潘金莲"},
    {"$set":{"addr.country":"Japan"}}
)

#6、修改数组:将第一个爱好改为洗澡
db.user.update(
    {"name":"潘金莲"},
    {"$set":{"hobbies.1":"洗澡"}}
)

#删除字段:不要爱好了
db.user.update(
    {"name":"潘金莲"},
    {"$unset":{"hobbies":""}}
)
2、加减操作:$inc

增加和减少$inc

#年龄都+1
db.user.update(
    {},
    {"$inc":{"age":1}},
    {"multi":true}
)
#年龄都-10
db.user.update(
    {},
    {"$inc":{"age":-10}},
    {"multi":true}
)
3、添加删除数组内元祖pushpop $pull

$push的功能是往现有数组内添加元素

#1、为名字为武大郎的人添加一个爱好read
db.user.update({"name":"武大郎"},{"$push":{"hobbies":"read"}})

#2、为名字为武大郎的人一次添加多个爱好tea,dancing
db.user.update({"name":"武大郎"},{"$push":{
    "hobbies":{"$each":["tea","dancing"]}
}})

$pop的功能是按照位置只能从头或从尾即两端删元素,类似于队列。1代表尾,-1代表头

#1、{"$pop":{"key":1}} 从数组末尾删除一个元素

db.user.update({"name":"武大郎"},{"$pop":{
    "hobbies":1}
})

#2、{"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"武大郎"},{"$pop":{
    "hobbies":-1}
})

$pull可以自定义条件删除

db.user.update({'addr.country':"China"},{"$pull":{
    "hobbies":"read"}
},
{
    "multi":true
}
)
4、避免重复添加 $addToSet 即多个相同元素要求插入时只插入一条
db.urls.insert({"_id":1,"urls":[]})

db.urls.update(
     {"_id":1},
     {
    "$addToSet":{
        "urls":{
        "$each":[
            'http://www.baidu.com',
            'http://www.baidu.com',
            'http://www.xxxx.com'
            ]
            }
        }
    }
)

原文地址:https://www.cnblogs.com/zhuminghui/p/8330429.html

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

推荐阅读更多精彩内容

  • 文档插入 插入是向MongoDB添加数据的基本方法,可使用 insert() 向目标集合插入一个文档,插入操作会给...
    JunChow520阅读 2,546评论 0 2
  • 只要是数据库那么就绝对离不开最为核心的功能: C U R D ,所以在Mongo 里面对于数据的操作也是有支持的,...
    Mr_米饭阅读 325评论 2 1
  • 现在下的version都是3.3.2以上的,里面的引擎也改掉了,所以不要用mongovue这个可视化工具了,推荐用...
    Ziksang阅读 2,686评论 0 10
  • 我的未来在哪里,每次被打击了就开始清醒,不然浑浑噩噩的,我要让那些看不起我的人闭嘴,必须,^_^^_^^_^
    愚公捕鱼阅读 83评论 0 0
  • 学习笔记 根据著名艾宾浩斯遗忘曲线图,可以看出我们的大脑随着时间的流逝很快就会遗忘掉很多事情。于是在学习的过程中,...
    Gulu_Lizi阅读 244评论 2 1