Нужна помощь в создании dry кода с динамическими c именами внутри функций / методов mongoose / mongodb - PullRequest
0 голосов
/ 22 апреля 2020

Я студент буткемпа, старый парень, но очень зеленый за ушами ...

У меня будет некое определенное количество коллекций mongoDB (в настоящее время 2), и я хочу построить динамику c dry скрипт для этого и будущих проектов.

Этот код / ​​скрипт работает, но кажется избыточным с повторяющимся блоком кода для каждой коллекции. Я подумал, что можно сделать l oop через список коллекций mongoDB с одним блоком кода, динамически меняющим имя коллекции. Однако я не могу понять, как заставить это работать. Второй блок кода - моя неудачная попытка (приветствуется критика в отношении рабочего и нерабочего кода - это единственный способ улучшить):

// empties the mongoDB collections and inserts fresh seed data
const mongoose = require("mongoose");
const db = require("../modelsMongoose");
const seedObj = require("../db/noSql/seeds"); // seed objects

mongoose.connect(
    process.env.MONGODB_URI || "mongodb://localhost:27017/dev_nosql",
    { useNewUrlParser: true, useUnifiedTopology: true }
);

db.User.deleteMany({})
    .then(() => db.User.collection.insertMany(seedObj.User))
    .then((data) => {
        console.log(`user document: ${data.result.n} records populated!`);
    })
    .then(() => mongoose.disconnect())
    .catch((err) => {
        console.error(err);
        process.exit(1);
    });

db.Activity.deleteMany({})
    .then(() => db.Activity.collection.insertMany(seedObj.Activity))
    .then((data) => {
        console.log(`activity document: ${data.result.n} records populated!`);
    })
    .then(() => mongoose.disconnect())
    .catch((err) => {
        console.error(err);
        process.exit(1);
    });

Я знаю, что этот код не будет выполняться (обратная связь vscode), но это объясняет концепцию того, чего я пытаюсь достичь. Я попытался написать с ['db.' + collectionName] и ['seedObj.' + collectionName], который понравился vscode, но безрезультатно. Спасибо за помощь! -Билл

const mongoose = require("mongoose");
const db = require("../modelsMongoose");
const seedObj = require("../db/noSql/seeds"); // seed objects

mongoose.connect(
    process.env.MONGODB_URI || "mongodb://localhost:27017/dev_nosql",
    { useNewUrlParser: true, useUnifiedTopology: true }
);

// loop array of mongoDB collection
Object.keys(mongoose.connection.collections).forEach(e => { 
    let collectionName = e.substring(1, 0).toUpperCase() + e.substring(1, e.length); 

    db.[collectionName].deleteMany({})
        .then(() => db.[collectionName].collection.insertMany(seedObj.[collectionName]))
        .then((data) => {
            console.log(`user document: ${data.result.n} records populated!`);
        })
        .then(() => mongoose.disconnect())
        .catch((err) => {
            console.error(err);
            process.exit(1);
        });
});

1 Ответ

1 голос
/ 22 апреля 2020

На самом деле есть более простой способ сделать это.

Я забираю код прямо из моего проекта в производстве.

Вы можете создать модуль только для обработки соединения с БД.

Я назвал его dbConection.js


/*eslint-env node*/

//Dependencies
const mongoose = require('mongoose');

//Winston Logger
const dbLog = require('./logger').get('dbCon');

//Require Models for DB
require('../models/Chat_History');
require('../models/User');
require('../models/benchmark');

//Global Variables
const MongodbPass = require('../creds/mongoKey');

//Connect to DB
const DB_Connection = mongoose.createConnection(MongodbPass.Database, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false
});

//Initiate the connection
DB_Connection
    .once('open', () => dbLog.info('DB Connected'))
    .catch(err => dbLog.error('Error Connecting to DB' + ' ' + err));


//Load Models for Chat DB
const Chat_DB = DB_Connection.model('chat');

//Load Models for User DB
const User_DB = DB_Connection.model('user');

//Load Models for Bench DB
const Bench_DB = DB_Connection.model('bench');

//Export them all
module.exports = { Chat_DB, User_DB, Bench_DB };


Одна из примеров моделей:


//Dependencies
const mongoose = require("mongoose");

//Global Constant
const Schema = mongoose.Schema;

// Create Schema
const ChatSchema = new Schema({
    channelId: {
        type: String
    },
    chatHistory: {
        type: Array,
        profImg: {
            type: String,

        },
        time: {
            type: String

        },
        msg: {
            type: String,

        },
        sender: {
            type: String,

        },
        timeStamp: {
            type: Date,

        }
    },

}, {
    collection: 'Chat'
});

mongoose.model('chat', ChatSchema);

Как вы можете использовать модуль в другом файле


//Load DB models
const DB_Connection = require('../path/to/dbConnection');

const chatDB =  DB_Connection.Chat_DB;
const userDB = DB_Connection.User_DB;
const benchDB = DB_Connection.Bench_DB;

//Query Different Collection on the fly.

    chatDB.find({})
    .then(result=>console.log(result))
    .catch(err=>console.log(err));

    userDB.find({})
    .then(result=>console.log(result))
    .catch(err=>console.log(err));


    benchDB.find({})
    .then(result=>console.log(result))
    .catch(err=>console.log(err))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...