Javascript 在mongoose/mongodb函数/方法中使用动态命名创建干式代码,是否需要帮助

Javascript 在mongoose/mongodb函数/方法中使用动态命名创建干式代码,是否需要帮助,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我是一个训练营的学生,一个老家伙,但非常环保 我将有一些未定义数量的mongoDB集合(目前为2个)要播种,并希望为这个项目和未来的项目构建一个动态的dry脚本 此代码/脚本可以工作,但似乎与每个集合的重复代码块无关。我认为应该可以通过一段代码动态更改集合名称来循环遍历mongoDB集合列表。然而,我不知道如何才能做到这一点。第二个代码块是我失败的尝试(欢迎对工作和非工作代码的批评-这是改进的唯一方法): 我知道这段代码不会运行(vscode反馈),但它解释了我试图实现的概念。我试图用vscod

我是一个训练营的学生,一个老家伙,但非常环保

我将有一些未定义数量的mongoDB集合(目前为2个)要播种,并希望为这个项目和未来的项目构建一个动态的dry脚本

此代码/脚本可以工作,但似乎与每个集合的重复代码块无关。我认为应该可以通过一段代码动态更改集合名称来循环遍历mongoDB集合列表。然而,我不知道如何才能做到这一点。第二个代码块是我失败的尝试(欢迎对工作和非工作代码的批评-这是改进的唯一方法):

我知道这段代码不会运行(vscode反馈),但它解释了我试图实现的概念。我试图用vscode喜欢的['db.'+collectionName]和['seedObj.'+collectionName]作为前缀,但没有用。谢谢你的帮助-账单

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);
        });
});

实际上有一种更简单的方法

我在这里直接从我的生产项目中获取代码

您可以创建一个仅用于处理DB连接的模块

我把它叫做
dbconsection.js


/*eslint环境节点*/
//依赖关系
const mongoose=require('mongoose');
//温斯顿记录器
const dbLog=require('./logger').get('dbCon');
//需要数据库的模型
需要(“../models/Chat_History”);
需要('../models/User');
需要(“../models/benchmark”);
//全局变量
const MongodbPass=require(“../creds/mongoKey”);
//连接到数据库
const DB_Connection=mongoose.createConnection(MongodbPass.Database{
useNewUrlParser:true,
useUnifiedTopology:正确,
UseFindModify:false
});
//启动连接
DB_连接
.once('open',()=>dbLog.info('DB Connected'))
.catch(err=>dbLog.error('error Connecting to DB'+''+err');
//聊天数据库的负载模型
const Chat_DB=DB_Connection.model('Chat');
//用户数据库的负载模型
const User_DB=DB_Connection.model('User');
//台架数据库的负载模型
const Bench_DB=DB_Connection.model('Bench');
//全部出口
module.exports={Chat_DB,User_DB,Bench_DB};
示例模型之一:


//依赖关系
const mongoose=需要(“mongoose”);
//全局常数
const Schema=mongoose.Schema;
//创建模式
const ChatSchema=新模式({
信道ID:{
类型:字符串
},
聊天记录:{
类型:数组,
利润:{
类型:字符串,
},
时间:{
类型:字符串
},
味精:{
类型:字符串,
},
发件人:{
类型:字符串,
},
时间戳:{
类型:日期,
}
},
}, {
收藏:“聊天”
});
mongoose.model('chat',ChatSchema);
如何实际使用另一个文件中的模块


//负载数据库模型
const DB_Connection=require(“../path/to/dbConnection”);
const chatDB=DB_Connection.Chat_DB;
const userDB=DB\u Connection.User\u DB;
const benchDB=DB_Connection.Bench_DB;
//动态查询不同的集合。
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))

感谢您抽出时间!这既回答了我的问题,也没有回答我的问题。它没有解释我如何动态地为我当前拥有的数据结构播种,但它确实表明更干净的定义使代码更具可读性。我希望系统能够动态地创建模型和种子,但理解发生了什么的能力却变得模糊了。我真的很欣赏真实世界的例子。谢谢,-比尔,不客气。但是为什么要动态更改集合名称呢?我在models文件夹中有一个index.js,它可以从现有文件动态创建模型。类似地,我在seeds文件夹中有index.js,它可以动态创建种子对象(使用匹配的文件名)。在适当的文件夹中创建模型和种子文件,对象将在导出的文件夹中。我想如果我没有为种子创建一个单独的代码块,那会很有趣。我可以循环集合名称,但找不到使代码动态工作的方法。由于复杂性,这是没有意义的,但我仍然想知道这是否可能。好的,我认为这可能是可行的。你说“种子”是什么意思?只是为了更好地理解你的方法。此外,你也许可以提出另一个关于这方面的问题,因为冗余部分已经解决了。
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);
        });
});