【问题标题】:Seeding mongoDB data in node.js by referencing ObjectId通过引用 ObjectId 在 node.js 中播种 mongoDB 数据
【发布时间】:2018-09-01 15:48:45
【问题描述】:

我正在使用mongoose-data-seed 将数据播种到 mongodb 中,但是它没有允许将 ObjectId() 作为对其他种子文件的引用传递的机制

【问题讨论】:

    标签: node.js mongodb seeding


    【解决方案1】:

    我找到了一种将每个播种机的输出存储在 json 文件中的方法,并从以前的种子中检索 ObjectIds 以在当前播种机中使用。这样我就可以从以前的播种机中引用 ObjectIds。

    seeding-helper.js

    const fs = require('fs');
    // const path = require('path');
    
    const seedersTmpDataFolder = 'seeders/bin';
    
    class SeedingHelper {
      static saveData(filename, data) {
        return new Promise((resolve) => {
          fs.writeFile(`${seedersTmpDataFolder}/${filename}.json`, JSON.stringify(data, null, '\t'), (err) => {
            if (err) throw err;
            resolve();
          });
        });
      }
    
      static readData(filename) {
        return new Promise((resolve) => {
          fs.readFile(`${seedersTmpDataFolder}/${filename}.json`, 'utf8', (err, data) => {
            if (err) throw err;
            resolve(JSON.parse(data));
          });
        });
      }
    }
    
    module.exports = SeedingHelper;
    

    resourceActions.seeder.js

    const { Seeder } = require('mongoose-data-seed');
    const mongoose = require('mongoose');
    const ResourceAction = require('../models/resourceAction');
    const SeedingHelper = require('../helpers/seeding-helper');
    
    const { Types: { ObjectId } } = mongoose;
    
    const data = [
      {
        _id: ObjectId(),
        name: 'test1'
      },
      {
        _id: ObjectId(),
        name: 'test2'
      },
    ];
    
    class ResourceActionSeeder extends Seeder {
      async shouldRun() { // eslint-disable-line class-methods-use-this
        return ResourceAction.count().exec().then(count => count === 0);
      }
    
      async run() { // eslint-disable-line class-methods-use-this
        let result;
        await SeedingHelper.saveData('resourceActions', data)
          .then(() => {
            result = ResourceAction.create(data);
          });
        return result;
      }
    }
    
    module.exports = ResourceActionSeeder;
    

    resources.seeder.js

    const { Seeder } = require('mongoose-data-seed');
    const mongoose = require('mongoose');
    const Resource = require('../models/resource');
    const SeedingHelper = require('../helpers/seeding-helper');
    
    const { Types: { ObjectId } } = mongoose;
    
    class ResourcesSeeder extends Seeder {
      async shouldRun() { // eslint-disable-line class-methods-use-this
        return Resource.count().exec().then(count => count === 0);
      }
    
      async run() { // eslint-disable-line class-methods-use-this
        let result;
        await SeedingHelper.readData('resourceActions')
          .then((resourceActionsData) => {
            const machinesId = ObjectId();
    
            const actionTest1 = ObjectId(resourceActionsData.find(x => x.name === 'test1')._id);
            const actionTest2 = ObjectId(resourceActionsData.find(x => x.name === 'test2')._id);
    
            const data = [
              {
                _id: machinesId,
                name: 'machines',
                actions: [
                  actionTest1,
                  actionTest2,
                ],
              },
            ];
    
            result = Resource.create(data);
    
            if (result) SeedingHelper.saveData('resources', data);
          });
        return result;
      }
    }
    
    module.exports = ResourcesSeeder;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 2018-11-28
      • 2018-02-28
      • 2021-06-02
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多