var mongoskin = require(‘mongoskin’),
    config = require(‘./../config.json’);

Node.js中使用mongoskin操作mongoDB实例,mongoskinmongodb

一、废话

从13年1月份接触mongodb进行开发,开发了旅游标签服务、微博标签检索系统、地图服务、web
APP服务…使用MongoDB的场景从.NET、JAVA环境转到了node.js平台。越发觉Node.js和mongodb结合感觉的很好。感觉mongodb和node.js是天生的一对。的确,mongodb的客户端是JS的解析引擎。因此,选择mongodb和node.js做产品原型也是很nice的选择。网上,遇到网友询问mongodb的开发,选择哪个driver最好,以前一直是使用原生的driver,但是写起来代码有很多需要注意的,比如连接的关闭操作等等…因此,在node.js开发环境下我这里推荐使用mongoskin。

二、几个需要说的概念

(1)数据库:同关系数据库一样。
(2)集合: 关系数据库中的表。
(3)文档: 类比关系数据库的记录,实则是JSON对象。
(4)数据库设计:建议考虑NoSQL设计,抛弃关系数据的设计思想;其实NoSQL数据库设计博大精深,需要不断地在项目中实践。
(5)用户体系:每一个数据库都有自己的管理员,可以:

复制代码 代码如下:

use dbname; db.addUser(‘root_1’ , ‘test’);

(7)建议更改对外端口
(8)启动服务(这是win下,linux下稍作修改):

复制代码 代码如下:

mongod –dbpath “XX\MongoDB\data\db” –logpath
“XX\MongoDB\log\mongo.log” –logappend -auth –port 7868

三、搭建mongodb开发基础设施

(0) npm install mongoskin 安装mongoskin

这里不介绍Node.js安装、package等机制。

(1)创建配置文件 config.json

复制代码 代码如下:

{
    “dbname”:”TEST”,
    “port”: “7868”,
    “host”: “127.0.0.1”,
    “username”: “test”,
    “password”: “test”
}

(2)创建util相关类mongo.js :导出一个DB对象

复制代码 代码如下:

var mongoskin = require(‘mongoskin’),
    config = require(‘./../config.json’);

/*
 * @des:导出数据库连接模块
 * */
module.exports = (function(){
    var host = config.host,
        port = config.port,
        dbName = config.dbname,
        userName = config.username,
        password = config.password,
        str = ‘mongodb://’ + userName + ‘:’ + password + ‘@’ + host +’:’

  • port+ ‘/’ + dbName;

    var option = {
        native_parser: true
    };

    return mongoskin.db(str, option);
})();

(3)构建CRUD的基础类:为了减少重复CURD代码,只需要传入相关的JSON对象即可

复制代码 代码如下:

var db = require(‘./mongo.js’),
    status = require(‘./status’),
    mongoskin = require(‘mongoskin’);

var CRUD = function(collection){
    this.collection = collection;
    db.bind(this.collection);
};

CRUD.prototype = {
    /*
    * @des: 创建一条记录
    * @model: 插入的记录,JSON格式的model
    * @callback:回调,返回插入成功的记录或者失败信息
    *
    * */
    create: function(model, callback){
        db[this.collection].save(model, function(err, item){
            if(err) {
                return callback(status.fail);
            }
            item.status = status.success.status;
            item.message = status.success.message;
            return callback(item);
        });
    },

    /*
    * @des:读取一条记录
    * @query:查询条件,Mongo查询的JSON字面量
    * @callback:回调,返回符合要求的记录或者失败信息
    *
    * */
    read: function(query, callback){
        db[this.collection].find(query).toArray(function(err,
items){
            if(err){
                return callback(status.fail);
            }
            var obj = {
                status: status.success.status,
                message: status.success.message,
                items: items
            };

            return callback(obj);
        });
    },
    /*
    * @des:更新一条记录
    * @query:查询条件,Mongo查询的JSON字面量,此处为_id
    * @updateModel:需要更新的JSON格式的模型
    * @callback:返回成功或者失败信息
    *
    * */
    update: function(query, updateModel, callback){
        var set = {set: updateModel};
        db[this.collection].update(query, set, function(err){
            if(err){
                return callback(status.fail);
            }else{
                return callback(status.success);
            }
        });
    },

    /*
    * @des:删除一条记录
    * @query:查询条件,Mongo查询的JSON字面量
    * @callback:返回失败或者成功的信息
    *
    * */
    deleteData: function(query, callback){
        db[this.collection].remove(query, function(err){
            if(err){
                return callback(status.fail);
            }
            return callback(status.success);
        });
    }
};

module.exports = CRUD;

(4)构建status.json,因为需要一些状态表示成功和失败,后期可以拓展为验证码错误、短信验证错误、用户名错误等

复制代码 代码如下:

module.exports = {
    /*
    * 成功状态
    *
    * */
    success: {
        status: 1,
        message: ‘OK’
    },

    /*
    * 失败状态
    *
    * */
    fail: {
        status: 0,
        message: ‘FAIL’
    },

    /*
    * 两次输入的密码不一致
    * */
    repeatPassword: {
        status: 0,
        message: ‘两次输入的密码不一致’
    }
 };

一、前言

上一章主要对项目引入MongoDB进行数据存储,并导入mongoose第三方组件,完成mongodb数据库配置及连结代码,本节继续。

Mysql

cnpm install mysql
mysql::先打开start.bat 用navicat连接 用户名为 localhost 密码 空 “”
具体看MysqlTest
创建连接
var mysql = require(‘mysql’);
var connection = mysql.createConnection({
host : ‘localhost’,
user : ‘root’,
password : ‘123456’,
database : ‘test’
});
connection.connect();
测试查询
connection.query(‘SELECT 1 + 1 AS solution’, function (error, results,
fields) {
if (error) throw error;
console.log(‘The solution is: ‘, results[0].solution);
}); // The solution is: 2

var sql = ‘SELECT * FROM websites’;
//查
connection.query(sql,function (err, result) {
if(err){
console.log(‘[SELECT ERROR] – ‘,err.message);
return;
}
console.log(result);
});

var addSql = ‘INSERT INTO websites(Id,name,url,alexa,country)
VALUES(0,?,?,?,?)’;
var addSqlParams = [‘菜鸟工具’,
‘https://c.runoob.com’,’23453′,
‘CN’];
//增
connection.query(addSql,addSqlParams,function (err, result) {
if(err){
console.log(‘[INSERT ERROR] – ‘,err.message);
return;
}
console.log(‘INSERT ID:’,result);
});

var modSql = ‘UPDATE websites SET name = ?,url = ? WHERE Id = ?’;
var modSqlParams = [‘菜鸟移动站’,
‘https://m.runoob.com’,6\];
//改
connection.query(modSql,modSqlParams,function (err, result) {
if(err){
console.log(‘[UPDATE ERROR] – ‘,err.message);
return;
}
console.log(‘UPDATE affectedRows’,result.affectedRows);
});

var delSql = ‘DELETE FROM websites where id=6’;
//删
connection.query(delSql,function (err, result) {
if(err){
console.log(‘[DELETE ERROR] – ‘,err.message);
return;
}
console.log(‘DELETE affectedRows’,result.affectedRows);
});
connection.end();

    /*
    * @des:删除一条记录
    * @query:查询条件,Mongo查询的JSON字面量
    * @callback:返回失败或者成功的信息
    *
    * */
    deleteData: function(query, callback){
        db[this.collection].remove(query, function(err){
            if(err){
                return callback(status.fail);
            }
            return callback(status.success);
        });
    }
};

使用nodejs查询mongodb中的数据,将查询结果暂时储存数组docs,docs超过16mb怎分开

1,仅查询出来需要的数据,其他字段不查,即显示查询字段
2,可以分段查询,按某个字段,比如时间、id,分批查询出来,操作
3,可以修改设置最大允许的查询量
 

二、技术关健词

Node、MongoDB、Angular2、mongoose

MongoDB

cnpm install mongodb
Mongodb: 命令行cd 进入D:\Program Files\MongoDB\Server\3.4\bin
目录下
执行服务端的执行文件 mongod.exe –dbpath D:\mongodb\db
就能打开数据库(实例看mongodbTest)

var MongoClient = require(‘mongodb’).MongoClient;
var DB_CONN_STR =
‘mongodb://localhost:27017/runoob’;
# 数据库为 runoob

1.使用mongo命令将数据库删除: 即另开一个cmd 输入 mongo 命令进入
shou dbs; 查看所有数据库
use db_name;
db.dropDatabase()
2.导入(指定文件夹)数据:
linux命令:mongorestore -d db_name 文件夹目录
windows命令:mongorestore.exe -d db_name 文件夹目录
MongoDB提供了备份和恢复的功能,分别是MongoDB下载目录下的mongodump.exe和mongorestore.exe文件.
例如:mongodump -h dbhost -d dbname -o dbdirectory
dbhost 填127.0.0.1:27017 dbname填要备份的数据库名 dbdirectory要放到哪里

部署到浏览器的话,后台运行 先 cd /usr/local/mongodb
执行 ./bin/mongod –dbpath /root/mongodb –logpath
/root/mongodb/mongodb.log –fork –port 27017
通过 ps aux |grep mongodb 查看进程

var insertData = function(db, callback) {
var collection = db.collection(‘site’); //连接到表 site
//插入数据
var data =
[{“name”:”菜鸟教程”,”url”:”www.runoob.com”},{“name”:”菜鸟工具”,”url”:”c.runoob.com”}];
collection.insert(data, function(err, result) {
if(err)
{
console.log(‘Error:’+ err);
return;
}
callback(result);
});
}

MongoClient.connect(DB_CONN_STR, function(err, db) {
console.log(“连接成功!”);
insertData(db, function(result) {
console.log(result);
db.close();
});
});

show dbs 自动创建了 runoob 数据库   show tables 自动创建了 site 集合(数据表)

db.site.find()查看集合中的数据

var selectData = function(db, callback) {
//连接到表
var collection = db.collection(‘site’);
//查询数据
var whereStr = {“name”:’菜鸟教程’};
collection.find(whereStr).toArray(function(err, result) {
if(err)
{
console.log(‘Error:’+ err);
return;
}
callback(result);
});
}

var updateData = function(db, callback) {
//连接到表
var collection = db.collection(‘site’);
//更新数据
var whereStr = {“name”:’菜鸟教程’};
var updateStr = {$set: { “url” :
“https://www.runoob.com”
}};
collection.update(whereStr,updateStr, function(err, result) {
if(err)
{
console.log(‘Error:’+ err);
return;
}
callback(result);
});
}

var delData = function(db, callback) {
//连接到表
var collection = db.collection(‘site’);
//删除数据
var whereStr = {“name”:’菜鸟工具’};
collection.remove(whereStr, function(err, result) {
if(err)
{
console.log(‘Error:’+ err);
return;
}
callback(result);
});
}

总结Schema、Model、Entity的关系

Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力

Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对

Entity : 由Model创建的实体,他的操作也会影响数据库

Schema、Model、Entity的关系是:Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比Entity更具操作性。

var CRUD = function(collection){
    this.collection = collection;
    db.bind(this.collection);
};

nodejs 操作mongodb 为何没返回?

代码发上来看下
 

一、废话
从13年1月份接触mongodb进行开发,开发了旅游标签服务、微博标签检索系统、地图…

  1. User.get = function(name, callback) {……})

上述代码,动态的为User类定义了一静态属性get,该属性实质是一个方法(function),该方法的作用是用于通过用户名获取用户信息.两个参数,第一个参数name:用户名,第二个参数callback:查询成功或失败后的回调函数。

  1. 用户查找的核心数据库操作代码是:

db.Users.findOne({“name”:name},function(err,user){……})
db.Users.find(null,function(err,users){……})
注意findOne与find的区别,一个是查找一个单一用户(不管查到有多少条记录,均只返回第一条记录),所以回调里返回值是user,而
find查找找返回所有符合条件的,所以是个集合users

  1. 将来对User.get方法的调用的客户端代码,将类似于:

//检查用户名是否已经存在

User.get(newUser.name, function(err, user) {

if (err) {

res.send({ status: ‘error’, message: “出错了,原因如下:” + err });

return;

}

if (user) {

res.send({ status: ‘failed’, message: “用户已存在!” });

return;

})

个人技术学习笔记,如有雷同,纯属正常,请勿喷,谢谢合作。

复制代码 代码如下:

4.1、新建users.js组件来封装【用户】模块功能

废话不多说,先代码奉上:

书接上文,直接在models文件下新建一users.js文件,代码如下:


var db = require(‘./mongodb’);

function User(user) {

this.name = user.name;

this.password = user.password;

this.email = user.email;

};

module.exports = User;

//存储用户信息

User.prototype.save = function(callback) {

//要存入数据库的用户文档

var user = {

name: this.name,

password: this.password,

email: this.email

};

//添加操作

var userModel = new db.Users(user);

userModel.save(function(err,user){

if(err){

console.err(err);

return callback(err);//错误,返回 err 信息

}

console.log(“sucess:”+user[0]);

callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档

});

};

//读取用户信息

User.get = function(name, callback) {

if (name){

db.Users.findOne({“name”:name},

function(err,user){

if(err) {

console.err(err);

return callback(err);//失败!返回 err 信息

}

callback(null, user);//成功!返回查询的用户信息

});

}else{

db.Users.find(null,

function(err,users){

if(err) {

console.err(err);

return callback(err);//失败!返回 err 信息

}

callback(null, users);//成功!返回查询的用户信息

});

}

};


图片 1

  1. var db = require(‘./mongodb’);

引入上节课创建的mongodb.js文件,将来会使用其导出的类实例。

  1. function User(user) {

this.name = user.name;

this.password = user.password;

this.email = user.email;

};

module.exports = User;

上述代码,利用函数的方式定义了一User类,三个字段:name,password,email,并通module.exports的方式对外导出。

  1. User.prototype.save = function(callback) {

…..

}

上述代码,动态的为User类定义了一静态属性,该属性实质是一个方法(function),该方法的作用是将来用于保存用户数据,注册用户时会用到,调用该方法成功后,会向Mongodb数据库的users文档中,插入一条记录,传入的参数:为一回调函数,用于执行成功或失败后的操作。

  1. var userModel = new db.Users(user);

userModel.save(function(err,user){

……

})

上述代码,首先创建mongodb.js文件中导出来Users模型实例,然后,核心的真正调用了mongodb数据库引擎向后台插入数据的代码是:userModel.save(function(err,user){……)
其中:save的两个参数,第一个参数err为如果插入出错,接收服务器返回的错误对象,第二个参数user为如果插入成功,返回操作成功的user用户实例集合。

5.
需要注意的是:如果插入成功,返回的user实际是一个集合,这里由于是插入操作,这个集合里将只有一条记录,即新增的user实例,所以接收时,需要使用user[0]的方式,即:
callback(null, user[0]);//成功!err 为 null,并返回存储后的用户文档

6.对这个User的save方法的调用代码,将来将类似于以下这样:

var newUser = new User({

name: name,  //接收前台传递过来的用户名

password: password, //接收前台传递过来的密码

email: req.body.email  //接收前台传递过来的Email

});

……

newUser.save(function(err, user) {   //调用该User实例的save方法

if (err) {

res.send({ status: ‘error’, message: “出错了,原因如下:” + err });

return;

}

res.send({ status: ‘success’, message: “注册成功!”, user: user });

});

复制代码 代码如下:

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

本章主要讲解:利用mongoose第三方库进行业务数据操作

图片 2

                                                  —  

一、废话

四、内容

(7)建议更改对外端口
(8)启动服务(这是win下,linux下稍作修改):

三、本章涉及核心技术点

图片 3

复制代码 代码如下:

4.2、新建post.js组件来封装【博客文章】模块功能

继续!在models文件下新建一posts.js文件,代码如下:


var db = require(‘./mongodb’);

function Post(name, title, post) {

this.name = name;

this.title = title;

this.post = post;

}

module.exports = Post;

//存储一篇文章及其相关信息

Post.prototype.save = function(callback) {

var date = new Date();

//存储各种时间格式,方便以后扩展

var time = {

date: date,

year : date.getFullYear(),

month : date.getFullYear() + “-” + (date.getMonth() + 1),

day : date.getFullYear() + “-” + (date.getMonth() + 1) + “-” +
date.getDate(),

minute : date.getFullYear() + “-” + (date.getMonth() + 1) + “-” +
date.getDate() + ” ” +

date.getHours() + “:” + (date.getMinutes() < 10 ? ‘0’ +
date.getMinutes() : date.getMinutes())

}

//要存入数据库的文档

var post = {

name: this.name,

time: time,

title: this.title,

post: this.post  //文章

};

var postModel = new db.Posts(post);

postModel.save(function(err){

if(err){

return callback(err);//错误,返回 err 信息

}

callback(null);//成功!

});

};

//读取文章及其相关信息

Post.get = function(name, callback) {

var query = {};

if (name) {

query.name = name;

}

db.Posts.find(query).sort({time:-1}).find(null,function (err, docs) {

if (err) {

return callback(err);//失败!返回 err

}

callback(null, docs);//成功!以数组形式返回查询的结果

});

}


图片 1

  1. var db = require(‘./mongodb’);

引入上节课创建的mongodb.js文件,将来会使用其导出的类实例。

  1. function Post(name, title, post) {

this.name = name;

this.title = title;

this.post = post;

}

module.exports = Post;

上述代码,利用函数的方式定义了一Post类,三个字段:name,title,post,含义与上节课定义的数据模型字段一致,并通module.exports的方式对外导出。

  1. Post.prototype.save = function(callback) {

…..

}

上述代码,动态的为Post类定义了一静态属性,该属性实质是一个方法(function),该方法的作用是将来用于保存用户发表的博文内容,用户发表文章时会用到,调用该方法成功后,会向Mongodb数据库的posts文档中,插入一条记录,传入的参数callback:为一回调函数,用于执行成功或失败后的操作。

  1.  var postModel = new db.Posts(post);

postModel.save(function(err){

……

})

上述代码,首先创建mongodb.js文件中导出来Posts模型实例,然后,核心的真正调用了mongodb数据库引擎向后台插入数据的代码是:postModel.save(function(err){……)

其中:参数err为如果插入出错,接收服务器返回的错误对象,第二个参数省去,因为不需要。

  1. 对这个Post的save方法的调用代码,将来将类似于以下这样:

…..

post = new Post(currentUser.name, req.body.title, req.body.post);

//console.log(post);

post.save(function(err) {

if (err) {

res.send({ status: ‘failed’, message: “出错了,原因如下:” + err });

} else {

res.send({ status: ‘successed’, message: “保存成功!” });

}

});

  1. Post.get = function(name, callback) {……})

上述代码,动态的为Post类定义了一静态属性get,该属性实质是一个方法(function),该方法的作用是用于通过用户名获取该用户发表的博文信息.两个参数,第一个参数name:用户名,第二个参数callback:查询成功或失败后的回调函数。

  1. var query = {};

if (name) {

query.name = name;

}

这段代码的意思是,如果从查询参数中获取到name值,则说明要获取某用户的博客列表,如果没有的话,说明要查找所有用户的博客信息

  1. db.Posts.find(query).sort({time:-1}).find(null,function (err, docs)
    {……})

这段代码是核心的操作数据库查询的代码,根据query传递的值来对posts集合(表)进行查询,如果query为空({}),则说明无条件查询(即查询所有)。sort({time:-1})的意思是对查询的结果按时间倒序排列。find(null,function(err,docs){….})
 ,其中的回调函数的第二参数,即用来接收从数据库中查询到符合条件的“博客文章内容”,注意:它是一个集合。

  1. 对Post.get方法调用的客户端示例代码:

Post.get(username, function(err, posts) {

if (err) {

posts = [];

}

res.send(posts);

});

这里不介绍Node.js安装、package等机制。

五、后述

本章代码下载:

下章剧透:

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

                                                      —
 完成Node后台的用户登录模块&加入Session支持

图片 5

{
    “dbname”:”TEST”,
    “port”: “7868”,
    “host”: “127.0.0.1”,
    “username”: “test”,
    “password”: “test”
}

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注