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}
例1:db.stu.find();
查询所有文档所有内容 //已过时
例2:db.stu.find({},{gender:1})
查询所有文档的gender属性(_id属性默认总是查出来)
例3:db.stu.find({},{gender:1,_id:0})
查询所有文档的gender属性,且不查询_id属性
例4:db.stu.find({gender:'male'},{name:1,_id:0})
查询所有gender属性值为male的文档中的name属性