资讯专栏INFORMATION COLUMN

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

leo108 / 3271人阅读

摘要:学习已经有三周了,是时候来一发学习总结啦。相关简介是非关系型的数据库。简单在于,所有的都由大括号,中括号,以及对构成。不同于,它是同步的。

学习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 ,直接删除即可。

(未完待续)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18712.html

相关文章

  • 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)

    摘要:如图连接成功后,显示你的数据库,在这个节目可以对数据库进行操作。如图安装与加载首先假定你已经安装了,命令行工具输入在使用的文件中即可。创建读取更新删除单值读取上文是在中基于对进行增删查改操作的简单介绍,以后会有进阶的文章。 关键词:mongodb安装 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查询,增加,修改,删除 工具介绍 Mon...

    lemon 评论0 收藏0
  • 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)

    摘要:如图连接成功后,显示你的数据库,在这个节目可以对数据库进行操作。如图安装与加载首先假定你已经安装了,命令行工具输入在使用的文件中即可。创建读取更新删除单值读取上文是在中基于对进行增删查改操作的简单介绍,以后会有进阶的文章。 关键词:mongodb安装 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查询,增加,修改,删除 工具介绍 Mon...

    SillyMonkey 评论0 收藏0
  • 用 Lucene 构建文档数据库

    摘要:说到档案系统,选文档数据库再合适不过了。熟悉的人看这个会很眼熟,没错,这就是从借鉴过来,并用在我的关系数据库查询上。接口规范接口的主要目是为了传递数据,数据结构已经在上面给出。为便于不同系统不同终端的数据交换,也将应当在接口支持之内。 说到档案系统,选文档数据库再合适不过了。谈到文档数据库一般想到的是 MongoDB、CouchDB 之类的,可这里要说的不是这些,而是另一个 NoSQL...

    inapt 评论0 收藏0
  • 用 Lucene 构建文档数据库

    摘要:说到档案系统,选文档数据库再合适不过了。熟悉的人看这个会很眼熟,没错,这就是从借鉴过来,并用在我的关系数据库查询上。接口规范接口的主要目是为了传递数据,数据结构已经在上面给出。为便于不同系统不同终端的数据交换,也将应当在接口支持之内。 说到档案系统,选文档数据库再合适不过了。谈到文档数据库一般想到的是 MongoDB、CouchDB 之类的,可这里要说的不是这些,而是另一个 NoSQL...

    zhangyucha0 评论0 收藏0

发表评论

0条评论

leo108

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<