MongoDB第一发:简介,CRUD,设计。(上)

学习mongoDB已经有三周了,是时候来一发学习总结啦。以下是个人学习心得总结,非官方,可能有纰漏和不准确之处,欢迎指正。

相关简介

1.mongoDB是非关系型(nosql)的数据库。
2.mongoDB是无模式(schemaless)的数据库,每个文档都有他自己的模式。
3.mongoDB是面向集合(collection)的数据库,它集成高扩展性和高性能于一身。
4.mongoDB不存在collection和collection之间 的join和transaction操作。
5.mongoDB通过mongo Shell展示给用户的数据格式是JSON,存储在mongoDB中的格式是BSON(JSON 的二进制格式),正是这种二进制存储方式更加提升了数据库的性能。
6.JSON是简单和复杂的结合体。简单在于,所有的JSON都由大括号,中括号,以及key-value对构成。
复杂之处在于,它可以进行各种任意的深层次的嵌套,来达到“任何你想要的数据模式”,这也是JSON的精髓之所在。
7.mongo Shell 不同于nodeJS,它是同步的。
8.mongoDB的数据模式设计的关键问题是“有没有必要嵌入”,通俗来讲就是有没有必要划分很多collection,是否可以适当的将一些collection进行合并(嵌入embed),后面第三部分详谈。
9.mongoDB和nodeJS一样底层都是用C++写的,这也是性能好的原因之一。
10.访问mongoDB的方式有两种,一种是直接通过mongoShell访问,这种访问方式简单快捷,操作命令跟js函数语法是无缝对接的,第二种就是app通过driver进行访问了。

CRUD

也就是传说中的增删改查,以下右边的就是mongoDB的增删改查:
Create – Insert
Read – Find
Update – Update
Delete – Remove

值得一说的是,mongoDB的操作函数(方法)和js 编程语言的语法的无缝对接的,这无形就形成了代码大一统的局面,不像一些SQL的语句是独立于编程语言的。

1.Find

nodejs中的mongoDB driver:

db.collection.find( { 1 }, { 2 }, { 3 } );
// 1.Selector    选择器,就类似于SQL中的 WHERE
// 2.projection  显示器,用于选择要显示的 key
// 3.option      选项,  用于选择排序,限制条数,跳过的操作
var selector = {type :"exam"}
   , projection = {score: 1}
   , option = {sort: 1, skip: 50, limit :20};
db.collection.find(selector, projection, option)

在MongoShell中查询

db.scores.find({type :"exam"}, {score: 1}).sort({score: 1}).skip(50).limit(20)

其中selector涉及到$gt, $gte, $lt, $lte, $regex, $exists, $all, $in的使用,

db.score.find({score: {$gt: 60, $lt: 100})             //查找score区于60到100之间记录db.user.find({name:{$regex:"q"},email:{$exists: true}) //名字中含有q,并有Email的    
db.fruits.find({$all :["banana", "apple"]})            //同时包含香蕉和苹果
db.fruit.find({$in : ["apple", "pear"]})               //有苹果或者有梨

2.Update

db.people.update( { 1 } , { 2 } , { 3 } )
// 1. selector 同上 
// 2. operator 
// 3. option   

其中operator涉及 $set $unset $inc 用来选择更新相关属性

db.people.update({name:"Alice"}, {name: "Alice", age:30}) //机械覆盖式更新
db.people.update({name:"Alice"}, {$inc:{age: 1}})         //选择更新age+1
db.people.update({name:"Alice"}, {$unset:{profession:1}}) //删除profession属性

利用$push $pop $ pushAll $pull $pullAll $addToSet 操作来数组

//设id为1 的数组                                             //[ 1,2,5,4,6] 
db.arrays.update({_id : 1}, {$pop: {a: 1}})                  //[ 1, 2, 5, 4   ]
db.arrays.update({_id : 1}, {$pop: {a: -1}})                 //[    2, 5, 4   ]
db.arrays.update({_id : 1}, {$pushAll: {a:[7,8,9]}}          //[    2, 5, 4, 7, 8, 9]
db.arrays.update({_id : 1}, {$pull:{a: 5}})                  //[    2,    4, 7, 8, 9]
db.arrays.update({_id : 1}, {$pullAll{a :[2,4,8]}})          //[             7,    9]
db.arrays.update({_id : 1}, {addToSet{ a : 5}})              //[             7, 9, 5]
db.arrays.update({_id : 1}, {addToSet{ a : 5}})              //[             7, 9, 5]

总结: $push 和 $pull这一对操作的类似数组的 『位移』就像stack
而 $ pushAll $pull $pullAll $addToSet 则直接 操作的是 『数组的值』

最后就是update中的option了,涉及两个 $multi 和 $upsert

// 假如要update的对象在collection中没有找到,但是还是要update则需要用upsert
db.people.update({age:{$gt:50},{$set:{name:"William"}},{upsert: true})
//更新多条数据,则必须使用 multi : true 否则只更新首条数据
db.people.update({}, {$set{title:{"Dr"}}, {multi: true})

3.Remove

这个简单只需要selector 即可删除选中记录,值得一提的是与update不同,操纵删除多条数据不需要使用$multi ,直接删除即可。

(未完待续)

    原文作者:tommy_william
    原文地址: https://segmentfault.com/a/1190000000469541
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞