项目实战(连载):基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(3)

本章主要讲什么(一句话)?

《项目实战:基于Angular2+Mongodb+Node技术实现的多用户博客系统教程(3)》

                                                      -- 基于MongoDB的MyBlog数据库知识技术储备(下)

一、前言

上一小节我们先简单的介绍MongoDB的一些入门的内容,主要包括MongoDB的下载、安装、配置及MongoDB简单的建库,删库,查询文档等基本功能,本篇我们将继续《基于MongoDB的MyBlog数据库设计篇》--高级篇,在此部分内容里将会涉及到以下内容:

1、MongoDB的的增、删、改、查语法及示例

2、Node与MongoDB的互操作部分

二、内容

2.1、MongoDB支持的数据类型

MongoDB支持许多数据类型的列表下面给出:

String : 这是最常用的数据类型来存储数据。在MongoDB中的字符串必须是有效的UTF-8。

Integer : 这种类型是用来存储一个数值。整数可以是32位或64位,这取决于您的服务器。

Boolean : 此类型用于存储一个布尔值 (true/ false) 。

Double : 这种类型是用来存储浮点值。

Min/ Max keys : 这种类型被用来对BSON元素的最低和最高值比较。

Arrays : 使用此类型的数组或列表或多个值存储到一个键。

Timestamp : 时间戳。这可以方便记录时的文件已被修改或添加。

Object : 此数据类型用于嵌入式的文件。

Null : 这种类型是用来存储一个Null值。

Symbol : 此数据类型用于字符串相同,但它通常是保留给特定符号类型的语言使用。

Date : 此数据类型用于存储当前日期或时间的UNIX时间格式。可以指定自己的日期和时间,日期和年,月,日到创建对象。

Object ID : 此数据类型用于存储文档的ID。

Binary data : 此数据类型用于存储二进制数据。

Code : 此数据类型用于存储到文档中的JavaScript代码。

Regular expression : 此数据类型用于存储正则表达式

2.2、MongoDB 插入文档

insert() 方法

要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法。

语法

insert() 命令的基本语法如下:

>db.COLLECTION_NAME.insert(document)

例子

title: 'MongoDB Overview',

description: 'MongoDB is no sql database',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 100

})

这里 mycol 是集合的名称,如前面的教程中创建。如果集合在数据库中不存在,那么MongoDB 将创建此集合,然后把它插入文档。插入文档中,如果我们不指定_id参数,然后MongoDB 本文档分配一个独特的ObjectId。

要插入单个查询的多个文档,可以传递一个数组 insert() 命令的文件。

示例

{

title: 'MongoDB Overview',

description: 'MongoDB is no sql database',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 100

},

{

title: 'NoSQL Database',

description: 'NoSQL database doesn't have tables',

by: 'tutorials fwytech',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 20,

comments: [

{

user:'user1',

message: 'My first comment',

dateCreated: new Date(2013,11,10,2,35),

like: 0

}

]

}

])

2.3、MongoDB 更新文档

MongoDB的 update() 和 save() 方法用于更新文档的集合。 update()方法更新现有的文档值,而替换现有的文档通过的文件中 save() 方法。

MongoDB Update() 方法

update()方法更新现有文档值。

语法:

update() 方法的基本语法如下

>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)

例子

考虑以下数据mycol集合。

下面的例子将设置新标题'MongoDB Overview'的文件,更新其标题是“New MongoDB Tutorial”

MongoDB默认将只更新单一的文件,来更新多个你需要设置参数置'multi' 为true

Tutorial'}},)

MongoDB Save() 方法

save() 方法替换现有的文档和通过新的文档 save() 方法

语法

MongoDB 的 save() 方法的基本语法如下:

>db.COLLECTION_NAME.save()

例子

{

}

)

2.4、MongoDB 删除文档

remove() 方法

MongoDB的 remove() 方法用于从集合中删除文档。remove() 方法接受两个参数。第一个是删除criteria ,第二是justOne标志:

deletion criteria :(可选)删除标准,根据文件将被删除。

justOne : (可选)如果设置为true或1,然后只删除一个文件。

语法:

基本语法remove()方法如下

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

例子

考虑以下数据mycol集合。

下面的例子将删除所有的文件,其标题是 'MongoDB Overview'

删除只有一个

如果有多个记录且要删除的只有第一条记录,那么设置remove()方法中justOne参数

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

例子:

先增加两条记录:

再删除:

发现只有第一条删除了

如果不加第2个参数1,则两条记录都会被删除!

删除所有文件

如果不指定删除条件,然后MongoDB将从集合中删除整个文件。这相当于SQL的truncate命令。

2.5、MongoDB 查询文档

find() 方法

要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法。

语法

基本的find()方法语法如下

>db.COLLECTION_NAME.find()

find() 方法将在非结构化的方式显示所有的文件。

pretty() 方法

结果显示在一个格式化的方式,可以使用 pretty() 方法.

语法:

例子

{

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "tutorials fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

除了find() 方法外,还有一个 findOne() 法,返回一个文件。

RDBMS Where子句和MongoDB等同语句

要查询文件的一些条件的基础上,可以使用下面的操作

AND 在MongoDB中用法

语法:

在 find() 方法,如果通过多个键分离',',那么 MongoDB 处理 AND 条件。AND 基本语法如下所示:

例子

下面给出的例子将显示所有的教程,标题是“MongoDB Overview“

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

对于上面给出的例子相当于where子句 ' where by='fwytech' AND title='MongoDB Overview' , 可以通过任意数量的键值对在 find 子句。

MongoDB中OR

语法:

OR条件的基础上要查询文件,需要使用$or关键字。OR 基本语法如下所示:

{

$or: [

,

]

}

).pretty()

例子

下面给出的例子将显示所有的教程,由'fwytech' 所写或标题是MongoDB Overview

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

AND 和 OR 一起使用

例子

下面给出的例子将显示有像的文件大于100,其标题是“MongoDB Overview'或者是'fwytech' 。等效于 SQL where子句 为 'where likes>10 AND (by = 'fwytech' OR title = 'MongoDB Overview')'

{

"_id": ObjectId(7df78ad8902c),

"title": "MongoDB Overview",

"description": "MongoDB is no sql database",

"by": "fwytech",

"tags": ["mongodb", "database", "NoSQL"],

"likes": "100"

}

2.6、MongoDB Limit/限制记录

Limit() 方法

要限制 MongoDB 中的记录,需要使用 limit() 方法。 limit() 方法接受一个数字型的参数,这是要显示的文档数。

语法:

limit() 方法的基本语法如下

>db.COLLECTION_NAME.find().limit(NUMBER)

示例

考虑集合myycol具有以下的数据

{ "title":"a",”clicks”:1}

{ "title":"b",”clicks”:2}

{ "title":"c",”clicks”:3}

下面的例子将显示只有2个文档,当执行文档查询。

{ "title":"a",”clicks”:1}

{ "title":"b",”clicks”:2}

如果不指定数量 limit() 方法的参数,它会显示从集合中的所有文件。

MongoDB Skip() 方法

除了limit() 方法,还有一个方法skip() 也接受数字类型的参数,并使用跳过的文档数。

语法:

skip()方法基本语法如下

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

示例:

下面的例子将只显示第二个文档。

{ "title":"b",”clicks”:2}

请注意,skip()方法的默认值是0

2.7、Node中操作MongoDB

PS:

前提-1:已经安装node

前提-2:已经安装mongodb

前提-3:项目中安装了mongodb模块

前提-4:Mongodb服务器已经开启监听

命令如下:cnpm install mongodb

2.7.1、连接数据库

var mongo=require("mongodb");

var host="localhost";

var port="27017";

var server=new mongo.Server(host,port,);//创建数据库所在的服务器服务器

var db=new mongo.Db("node-mongodb ",server,);//创建数据库对象

db.open(function (err,db) {//连接数据库

if(err)

throw err;

else{

console.log("成功建立数据库连接");

db.close();

}

});

db.on("close", function (err,db) {//关闭数据库

if(err) throw err;

else console.log("成功关闭数据库.");

});

PS:关闭数据库db.close([forceClose],[callback]);

forceClose为true时,强制关闭该数据库,当数据库关闭后,不可再使用open开启数据库.forceClose为false时,不强制关闭数据库,当数据库关闭后,可以再使用open打开.

2.7.2、插入数据

插入数据后,在控制台中输出数据文档的内容

var mongo=require("mongodb");

var host="localhost";

var port="27017";

var server=new mongo.Server(host,port,);//创建数据库所在的服务器服务器

var db=new mongo.Db("node-mongodb",server,);//创建数据库对象

db.open(function (err,db) {//连接数据库

if(err)

throw err;

else{

db.collection("employees", function (err,collection) {

collection.insert(, function (err,docs) {

console.log(docs);

db.close();

});

});

}

});

db.on("close", function (err,db) {//关闭数据库

if(err) throw err;

else console.log("成功关闭数据库.");

});

2.7.3、读取数据

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongodb",server,);

db.open(function (err,db) {

db.collection("employees", function (err,collection) {

if(err) throw err;

else{

collection.find({}).toArray(function(err,docs){

else{

console.log(docs);

db.close();

}

});

}

});

});

2.7.4、带查询条件的搜索

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongodb",server,);

db.open(function (err,db) {

db.collection("users", function (err,collection) {

if(err) throw err;

else{

collection.find(}).toArray(function(err,docs){

else{

console.log(docs);

db.close();

}

});

}

});

});

2.7.5、多条件查询

插入一批数据,并且进行搜索type==food且price字段值小于10

var mongo=require("mongodb");

var host="localhost";

var port="27017" ;

var server=mongo.Server(host,port,);

var db=new mongo.Db("node-mongo-examples",server,);

var docs=[

{type:"food",price:11},

{type:"food",price:10},

{type:"food",price:9},

{type:"food",price:8},

{type:"book",price:9}

];

db.open(function (err,db) {

db.collection("goods", function (err,collection) {

if(err) throw err;

else{

collection.insert(docs, function (err,docs) {

else{

collection.find(}).toArray(

function(err,docs){

if(err) throw err;

else{

console.log(docs);

db.close();

}

}

);

}

})

}

});

});

查询中的或的表达:

如:查询where type=”food” or price

collection.find({$or:[

,

}

]})

三、总结

1.什么是MongoDB?有什么优缺点?

2.MongoDB的增删改查

3.Node中如何操作MongoDB

四、后述

    本小节我们主要介绍了MongoDB的更常用的较高级一些的内容,主要包括MongoDB的增删改查及、及如何与Node连结操作的示例代码。为后继我们的更高级的项目部分做了一个必要的技术储备。(PS:本部分内容涉及到一些简单的Node知识,需要大家自行补充一些关于Node的基本用法,后继我也打算较系统的出一些关于Node及Angular2的零基础入门内容)。

  《基于Angular2+Mongodb+Node技术实现的多用户博客系统》正在连载中,明天我将为大家推出【第四章:系统后台Node Express框架搭建】,欢迎各位继续关注~

    搜索并关注“风舞烟”的简书专栏、头条号、微信公众号、 企鹅媒体平台,你可以定期收到关于简书专栏的最新动态以及IT前沿最新技术的高质量经验文章、视频分享。

    谢谢大家的支持,欢迎大家留言交流。

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

推荐阅读更多精彩内容