当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

ES6最简单的方式访问MongoDB

作者:小梦 来源: 网络 时间: 2024-05-08 阅读:

前言
MongoDB越来越流行,NodeJS也越来越流行,也许你第一时间用上了KOA框架,但是如何才能在KOA用ES6的方式访问MongoDB呢?其实Github上不少类似的方案,比如你继续使用mongoose的Promise方式操作数据库,其实都没什么不可以。我的项目比较简单,不想用太多复杂的框架,自己写个Helper来连接数据库好了。

代码其实很简单,我贴出来,给官方驱动包个Promise壳儿,所有操作返回官方Promise,然后yield调用就这么简单

// helper_mongo.js文件// 作者freewolf// 当然还是使用官方驱动var MongoClient = require('mongodb').MongoClient;var ObjectID = require('mongodb').ObjectID;var mongoLink = ''; // 这里修改成你的MongoLink字符串mongodb://user:password@yourserver// 插入方法var insert = function(collectionName, obj) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);collection.insert(obj, {w: 1}, function(err, res) {    db.close();    if (err) reject(err);    else resolve(res[0]);});        });    });}// 更新var update = function(collectionName, obj) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);collection.update({_id: new ObjectID(obj._id)}, obj, {upsert: true,w: 1}, function(err, res) {    db.close();    if (err) reject(err);    else resolve(res);});        });    });}// 查找一个var findOne = function (collectionName, query, option) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);if(option==undefined || option==null){    collection.findOne(query, function(err, res) {        db.close();        if (err) reject(err);        else resolve(res);    });}else{    collection.findOne(query, option, function(err, res) {        db.close();        if (err) reject(err);        else resolve(res);    });}        });    });}// 查找多个var find = function(collectionName, query, option) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);if(option==undefined || option==null){    collection.find(query).toArray(function(err, res) {        db.close();        if (err) reject(err);        else resolve(res);    });}else{    collection.find(query, option).toArray(function(err, res) {        db.close();        if (err) reject(err);        else resolve(res);    });}        });    });}// 删除var remove = function(collectionName, query) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);collection.remove(query, {w: 1}, function(err, res) {    db.close();    if (err) reject(err);    else resolve(res);});        });    });}// 计数var count = function(collectionName, query, option) {    return new Promise(function(resolve, reject) {        MongoClient.connect(mongoLink, function(err, db) {if (err) reject(err);var collection = db.collection(collectionName);if(query==undefined || query==null)    query = {};if(option==undefined || option==null){    collection.count(query, function(err, count) {        db.close();        if (err) reject(err);        else resolve(count);    });}else{    collection.count(query, option, function(err, count) {        db.close();        if (err) reject(err);        else resolve(count);    });}        });    });}module.exports.insert = insert;module.exports.update = update;module.exports.findOne = findOne;module.exports.find = find;module.exports.remove = remove;module.exports.count = count;

好了 Helper结束
怎么使用呢?
使用一个Service来装饰一下

// service.js文件var ObjectID = require('mongodb').ObjectID;var helperMongo = require('./helper_mongo');module.exports = {    // 创建    insert : function * (obj){        var res = yield helperMongo.insert(this.collectionName, obj);        return res;    },    // 更新    update : function * (obj){        var res = yield helperMongo.update(this.collectionName, obj);        return res;    },    // 删除    remove : function * (id){        var res = yield helperMongo.remove(this.collectionName, { _id : new ObjectID(id) });        return res;    },    // 查询    find : function * (query, option){        var res = yield helperMongo.find(this.collectionName, query, option);        return res;    },    // 查询    findOne : function * (query, option){        var res = yield helperMongo.findOne(this.collectionName, query, option);        return res;    },    // 取全部    getAll : function * (){        var res = yield helperMongo.find(this.collectionName, {});        return res;    },    // 按照id查询    getById : function * (id){        var res = yield helperMongo.findOne(this.collectionName, { _id : new ObjectID(id) });        return res;    },    // 按照很多id来查询    getByIds :function * (ids, option){        ids = ids.map(function(id) { return new ObjectID(id); });        var res = yield helperMongo.find(this.collectionName, {_id: {$in: ids}}, option);        return res;    },    // 列出(带分页)    getByPage : function*(query, sort, pageSize, pageNum){        if(!query)query = {};        if(!sort)sort = [['_id', 'desc']];        var option = {sort : sort,limit: pageSize,skip : (pageNum - 1) * pageSize        };        var res = yield helperMongo.find(this.collectionName, query, option);        return res;    },    // 计数    count : function * (query){        if(!query)query = {};        var res = yield helperMongo.count(this.collectionName, query);        return res;    }}

然后呢?
其实更简单 单例的操作从service继承

// service_user.js举例var service = require('./service');var helperMongo = require('../helper_mongo');var ObjectID = require('mongodb').ObjectID;var Service = function(){    this.collectionName = 'users';    // 这里扩充你自己的方法 比如 按照邀请码搜索    this.getByInviteCode = function * (inviteCode){        var res = yield this.findOne({ invitecode : inviteCode });        return res;    }    if(Service.instance == null)    {        Service.instance = this;    }    return Service.instance;}Service.prototype = service;module.exports = Service;

好了 再看如何使用

var co = require('co');var ServiceUser = require('./service_user.js');var serviceUser = new ServiceUser();// 其实可以直接返回单例实例在service_user.js 但是WS不能出提示 还是这样吧// Demo下co(function*(){    var user = {name:'freewolf', password:'123', invitecode:'abcd'};    // 插入    yield serviceUser.insert(user);         // 查找 使用service包装的方法    var user1 = yield serviceUser.find({name:'freewolf'});    // 查找 使用扩展方法    var user2 = yield serviceUser.getByInviteCode('abcd');    // 分页    var sort = [['lastedittime', 'desc']];    var pageSize = 20;  // 每页20条    var pageNum = 1;    // 第一页    var users = yield serviceUser.getByPage({}, sort, pageSize, pageNum);    // ......});

就写这么多吧,这个玩意就是官方驱动包个壳,很好用,满足一般的需求。其实JS我并不太擅长,有什么语法怪怪的地方,欢迎大家拍砖~