如何在 Node/MongoDB 中播种依赖数据

Posted

技术标签:

【中文标题】如何在 Node/MongoDB 中播种依赖数据【英文标题】:How to seed dependent data in Node/MongoDB 【发布时间】:2016-01-16 03:13:43 【问题描述】:

我正在尝试使用 objectID 为具有一对多关系的 MongoDB 数据库播种。类似于以下内容:

var postSchema = mongoose.Schema(
  name: type: String, required: true, unique: true,
  description: type: String,
  userlikes: [type: mongoose.Schema.Types.ObjectId, ref: 'Users']
);

这个的同步实现看起来像这样(伪代码):

openConnection()
cleardb()
users = createUsers()  
post = createPost(users)

使用 Node 我需要嵌套这些调用中的每一个,这会变得混乱并难以重用对象(我可能想在之后创建更多的依赖对象)。我看过 async 但在这种情况下似乎没有太大帮助 - 我可以使用 async.waterfall 但这会给我一些类似于嵌套解决方案的东西,只是扁平化成一个数组。

当播种相关数据时,如果您可以创建数据对象然后假设它们存在以构建后续数据结构,那么显然会有所帮助。显然,异步方法不会真正发生这种情况。我错过了这里的重点吗?

我假设节点如此广泛地用于 API,这将是设置测试数据的常见挑战,但我无法在任何地方找到一个优雅的解决方案。

谁能告诉我如何在节点设置中解决这个问题的示例实现?

【问题讨论】:

【参考方案1】:

使用异步可能非常方便。 归根结底,所有业务逻辑/任务只是一系列操作。瀑布是一种对您的解决方案非常有用的抽象。

例如:seed.js

var User = require('../path/to/your/models/User');
var Post = require('../path/to/your/models/Post');
var DB   = require('../path/to/your/database/boot/module');
var config = require('../path/to/your/configuration');

function startDB(config, callback) 
  DB.start(config, callback);


function createUsers(userParams, callback) 
  User.save(userParams, callback); 


function createPost(users, callback) 
  Post.save(users, callback);


function resolvedCallback(err, posts) 
  if (err)
    return your-error-handling-here;

  console.log(posts);
  DB.cleanup(console.log.bind(null, 'clean up finished: '));


async.waterfall([
  async.constant( db: config.dbOpts),
  startDB, // we don't need the wrapper, we could use DB.start
  createUsers,
  createPost ], resolvedCallback);

如果您正在使用一些测试框架(mocha/tape),您可以在所有测试之前初始化数据库并在开始/所有测试之后进行清理。

干杯

【讨论】:

谢谢。这几乎就是我所做的,只是这隐藏了很多复杂性,因为 Post 需要引用在 createUsers 中创建的对象,当然在 createUsers 中创建多行数据也必须在 async 或等效的范围内运行。

以上是关于如何在 Node/MongoDB 中播种依赖数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EF 4.3 中使用带有复杂键的 AddOrUpdate 播种数据

如何为具有范围批量分配的 Rails 3.1 应用程序播种

如何将数据播种到已创建的数据库中?

在 python 金字塔 web 框架中,如何在播种之前删除所有数据库表行?

node mongodb数据库 打开 和操作

Sequelize - 如何使用几何值播种数据库?