MongoDB学习笔记

mongodb文档数据库,存储的是文档(Bson文档是json的二进制化),就是json的二进制对象

特点:内部执行引擎为JS解释器,把文档存储成bson结构,在查询时转化成JS对象,并可以通过熟悉的JS语法来操作

mongo和传统型数据库相比最大的不同
传统型数据库:结构化数据,定好了表结构后,每一行的内容,必是符合表结构的,就是说–列的个数类型都一样
mongo文档型数据库:表下的每篇文档都可以有自己独特的结构(json对象都可以有自己独特的属性和值)

思路:如果有电影,影评,影评的回复,回复的打分
在传统型数据库中,至少要4张表,关联度非常复杂
在文档数据库中,通过1篇文档,即可完成,体现存储文档型数据库的反范式化
{
film:”天龙八部”,
comment:[content:”王家卫的电影风格”,reply:[“支持”,好]]
}

mongodb的安装

1、下载mongodb从www.mongodb.org
这里写图片描述
2、安装
可以选择custom安装,自己设置安装路径
3、创建数据库文件的存放位置,比如d:/mongodb/data/db。启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。
4、这里写图片描述

mongo入门命令

1、启动mongod服务

      mongod  --dbpath  /path/to/database --logpath /path/to /log    --port 27017
      参数解释:
        --dbpath 数据存储目录
        --logpath 日志存储目录
        --port 运行端口(默认27017)
     mongod --dbpath c:/mongodb/data/db/ --logpath c:/mongodb/data/log/mongodb.log  --port 27017
     启动以后,直接输入mongo就可以进入客户端

2、库表命令

     ①show dbs; 查看当前的数据库
     ②show tables/collections; 查看当前库下的collection
     ③如何创建库?
          Mongodb的库是隐式创建,你可以use一个不存在的库,然后  在该库下创建collection即可创建库
     ④db.createCollection("collectionName")//创建collection
     ⑤collection允许隐式创建
          db.collectionName.insert(document)
     ⑥db.collectionName.drop()//删除collection
     ⑦db.help()
     ⑧db.dropDatabase();

3、增删改查操作
增:insert
介绍mongodb存储的都是文档,文档是json格式的对象
语法:db.collectionName.insert(document)

①增加单篇文档
   db.user.insert({name:lisi,age:22});
   结果:
   > db.user.find();
   { "_id" : ObjectId("59e6c94218ee4256596124c8"), "name" : "lisi", "age" : 22 }

②增加单个文档,并指定_id
   db.user.insert({_id:2,name:'poly',age:23})
   结果:
   > db.user.find();
   { "_id" : ObjectId("59e6c94218ee4256596124c8"), "name" : "lisi", "age" : 22 }
   { "_id" : 2, "name" : "poly", "age" : 23 }

③增加多个文档
   db.user.insert([
   {name:'songjiang',gender:'m'},
   {name:"dalang",gender:'m'}, 
   {name:'lipinger',gender:'f'},
   {name:'jinlian',gender:'f'}])
   结果:
   > db.user.find();
   { "_id" : ObjectId("59e6d2ab18ee4256596124c9"), "name" : "songjiang", "gender" : "m" }
   { "_id" : ObjectId("59e6d2ab18ee4256596124ca"), "name" : "dalang", "gender" : "m" }
   { "_id" : ObjectId("59e6d2ab18ee4256596124cb"), "name" : "lipinger", "gender" : "f" }
   { "_id" : ObjectId("59e6d2ab18ee4256596124cc"), "name" : "jinlian", "gender" : "f" }

删:remove
语法:db.collectionName.remove(查询表达式,选项)
选项是指{justOne:true/false},是否只删除一行,默认为false

注意:
查询表达式依然是个json对象
查询表达式匹配的行,将被删掉
如果不写查询表达式,collection中的所有文档将被删掉

 例1、 db.user.remove({gender:'f'})
 删除user表中gender属性值为‘f’的文档
 结果:
 > db.user.find();
 { "_id" : ObjectId("59e6d2ab18ee4256596124c9"), "name" : "songjiang", "gender" : "m" }
 { "_id" : ObjectId("59e6d2ab18ee4256596124ca"), "name" : "dalang", "gender" : "m" } 

 例2、 db.user.remove({gender:'m'},true)
 删除user表中gender属性为m的文档,只删除1行
 结果:
 > db.user.find();
 { "_id" : ObjectId("59e6d2ab18ee4256596124ca"), "name" : "dalang", "gender" : "m" }

改:update
改谁?–查询表达式
改成什么样?–新值或赋值表达式
操作选项?–可选参数

语法:db.collectionName.update(查询表达式,新值,选项)

例:
 db.user.update({name:'dalang'},{name:'wudalang'})
 是指选中user表中,name值为‘dalang’的文档,并把其文档值改为{name:'wudalang'},
 **结果:文档中的其他列也不见了,改后只有_id和name列了**
 > db.user.find();
 { "_id" : ObjectId("59e6d2ab18ee4256596124ca"), "name" : "wudalang" }
 即--新文档直接替换了旧文档,而不是修改

如果是想修改文档的某列,可以用set关键字  
 db.user.update({name:’dalang’},{
set:{name:’wudalang’}})
结果:
{ “_id” : ObjectId(“59e6f02b18ee4256596124ce”), “name” : “wudalang”, “gender” : “m” }

修改时赋值表达式
$set  修改某列的值
$unset  删除某个列
$rename 重命名某个列
$inc 增长某个列
$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段
没修改之前:
{ "_id" : ObjectId("59e6f0f918ee4256596124d1"), "name" : "wukong", "jingu" : true, "sex" : "m", "age" : 500 }

db.user.update({name:'wukong'},{$set:{name:'dzsf'},$unset:{'jingu':0},$rename:{sex:'gender'},$inc:{age:16}})

结果:
{ "_id" : ObjectId("59e6f0f918ee4256596124d1"), "name" : "dzsf", "age" : 532, "gender" : "m" }

option的作用{upsert:true/false,multi:true/false}
upsert–是指没有匹配的行,则直接插入该行(和mysql中的replace一样)


例:> db.user.update({name:'wuyong'},{$set:{name:'junshiwuyong'}})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.user.update({name:'wuyong'},{$set:{name:'junshiwuyong'},$setOnInsert:{gender:'male'}},{upsert:true})
WriteResult({
        "nMatched" : 0,
        "nUpserted" : 1,
        "nModified" : 0,
        "_id" : ObjectId("59e6f63db5d3cd4e79277a9b")
})
> db.user.find();
{ "_id" : ObjectId("59e6f02b18ee4256596124cd"), "name" : "songjiang", "gender" : "male" }
{ "_id" : ObjectId("59e6f02b18ee4256596124ce"), "name" : "wudalang", "gender" : "male" }
{ "_id" : ObjectId("59e6f02b18ee4256596124cf"), "name" : "lipinger", "gender" : "f" }
{ "_id" : ObjectId("59e6f02b18ee4256596124d0"), "name" : "jinlian", "gender" : "f" }
{ "_id" : ObjectId("59e6f0f918ee4256596124d1"), "name" : "dzsf", "age" : 532, "gender" : "male" }
{ "_id" : ObjectId("59e6f63db5d3cd4e79277a9b"), "name" : "junshiwuyong", "gender" : "male" }


multi:是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
例:> db.user.update({gender:'m'},{$set:{gender:'male'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find();
{ "_id" : ObjectId("59e6f02b18ee4256596124cd"), "name" : "songjiang", "gender" : "male" }
{ "_id" : ObjectId("59e6f02b18ee4256596124ce"), "name" : "wudalang", "gender" : "m" }
{ "_id" : ObjectId("59e6f02b18ee4256596124cf"), "name" : "lipinger", "gender" : "f" }
{ "_id" : ObjectId("59e6f02b18ee4256596124d0"), "name" : "jinlian", "gender" : "f" }
{ "_id" : ObjectId("59e6f0f918ee4256596124d1"), "name" : "dzsf", "age" : 532, "gender" : "m" }
> db.user.update({gender:'m'},{$set:{gender:'male'}},{multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
>
> db.user.find();
{ "_id" : ObjectId("59e6f02b18ee4256596124cd"), "name" : "songjiang", "gender" : "male" }
{ "_id" : ObjectId("59e6f02b18ee4256596124ce"), "name" : "wudalang", "gender" : "male" }
{ "_id" : ObjectId("59e6f02b18ee4256596124cf"), "name" : "lipinger", "gender" : "f" }
{ "_id" : ObjectId("59e6f02b18ee4256596124d0"), "name" : "jinlian", "gender" : "f" }
{ "_id" : ObjectId("59e6f0f918ee4256596124d1"), "name" : "dzsf", "age" : 532, "gender" : "male" }

查:find findOne
语法:db.collectionName.find(查询表达式,查询的列)
db.collectionName.find(查询表达式,{列1:1,列2:1}

1db.stu.find();
查询所有文档所有内容 //已过时

例2:db.stu.find({},{gender:1})
查询所有文档的gender属性(_id属性默认总是查出来)3db.stu.find({},{gender:1,_id:0})
查询所有文档的gender属性,且不查询_id属性

例4db.stu.find({gender:'male'},{name:1,_id:0})
查询所有gender属性值为male的文档中的name属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值