如何在 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 播种数据