NodeJS类结构中的MongoDB

时间:2018-09-28 15:37:14

标签: node.js mongodb

是否可以在NodeJS的类结构中使用MongoDB?

我了解您可以在

之类的连接方法中对数据库执行CRUD操作

SUMMARIZE

但是我想知道是否有一种方法可以打开与数据库的连接,可以在整个类中访问它,然后在完成类的使用后将其关闭。

例如:

DateDay

编辑:

我刚刚在Node.JS Mongo docs中遇到了更多信息。也许与此类似的东西行得通吗?

mongo.connect(url, function(err, client){//do some CRUD operation});

2 个答案:

答案 0 :(得分:2)

您可以创建一个类,该类将充当任何核心库的包装器,这样做将为您带来以下好处:

使用您自己的服务包装任何核心模块将使您能够:

  1. 创建可在应用程序中的多个组件上使用的可重用服务。
  2. 标准化该模块的API,并添加您的应用所需的更多方法,而该模块不提供这些方法。
  3. 轻松地用另一个模块替换您选择的数据库模块(如果需要)。

我创建了该服务,并将其用于我的项目MongoDB

var mongoClient = require("mongodb").MongoClient,
  db;

function isObject(obj) {
  return Object.keys(obj).length > 0 && obj.constructor === Object;
}

class mongoDbClient {
  async connect(conn, onSuccess, onFailure){
    try {
      var connection = await mongoClient.connect(conn.url, { useNewUrlParser: true });
      this.db = connection.db(conn.dbName);
      logger.info("MongoClient Connection successfull.");
      onSuccess();
    }
    catch(ex) {
      logger.error("Error caught,", ex);
      onFailure(ex);
    }
  }

  async getNextSequence(coll) {
    return await this.db.collection("counters").findOneAndUpdate({
        _id: coll
      },
      {$inc: {seq: 1}},
      {projections: {seq: 1},
        upsert: true,
        returnOriginal: false
      }
    );
  }

  async insertDocumentWithIndex(coll, doc) {
    try {
      if(!isObject(doc)){
        throw Error("mongoClient.insertDocumentWithIndex: document is not an object");
        return;
      }
      var index = await this.getNextSequence(coll);
      doc.idx = index.value.seq;
      return await this.db.collection(coll).insertOne(doc);
    }
    catch(e) {
      logger.error("mongoClient.insertDocumentWithIndex: Error caught,", e);
      return Promise.reject(e);
    }
  }

  async findDocFieldsByFilter(coll, query, projection, lmt) {
    if(!query){
      throw Error("mongoClient.findDocFieldsByFilter: query is not an object");
    }
    return await this.db.collection(coll).find(query, {
      projection: projection || {},
      limit: lmt || 0
    }).toArray();
  }

  async findDocByAggregation(coll, query) {
    if(!query.length){
      throw Error("mongoClient.findDocByAggregation: query is not an object");
    }
    return this.db.collection(coll).aggregate(query).toArray();
  }

  async getDocumentCountByQuery(coll, query) {
    return this.db.collection(coll).estimatedDocumentCount(query || {})
  }

  async findOneAndUpdate(coll, query, values, option) {
    if(!(isObject(values) && isObject(query))){
      throw Error("mongoClient.UpdateDocument: values and query should be an object");
    }
    return this.db.collection(coll).findOneAndUpdate(query, {$set : values}, option || {})
  }

  async modifyOneDocument(coll, query, values, option) {
    if(!(isObject(values) && isObject(query))){
      throw Error("mongoClient.ModifyOneDocument: values, query and option should be an object");
    }
    return await this.db.collection(coll).updateOne(query, values, option || {})
  }

  async close() {
    return await this.db.close();
  }
}

module.exports = {
  mongoDbClient: mongoDbClient
}

要获取我对lib的完整访问权限,可以参考here

答案 1 :(得分:1)

是的,您可以在一个类中完成所有这些操作,但是在设置了构造函数之后,您将无法设置db之类的成员变量。您可以将其设置为全局变量,但不能设置该变量。

const MongoClient = require('mongodb').MongoClient;

var database; //global
class DB {

    constructor(url, dbName) {
        this.url = url;
        this.dbName = dbName;
    }

    connect() {
        console.log('connecting to database ' + this.dbName + ' with URL ' + this.url);
        return new Promise((resolve, reject) => {
            MongoClient.connect(this.url, (err, client) => {
                if (err) {
                    reject(err);
                } else {
                    database = client.db(this.dbName);
                    resolve(client.db(this.dbName));
                }
            });
        })

    }
}