通过mongoose使用引用为MongoDB播种的正确方法

时间:2018-07-05 16:57:35

标签: mongodb mongoose

我有三个模式,一个模式引用了另外两个模式:

userSchema

export class AppComponent {
  datesSelected:NgbDateStruct[]=[]; 
  change(value:NgbDateStruct[])
  {
    this.datesSelected=value;
  }

postSchema

{ name: String }

评论模式

{ content: String }

如何以理智,可扩展的方式为该数据库添加种子?甚至使用bluebird都保证它很快就会成为写作的噩梦。

到目前为止,我的尝试涉及多个嵌套的Promise,并且很难维护:

{ 
  content: String,
  user: { ObjectID, ref: 'User' },
  post: { ObjectID, ref: 'Post' }
}

这显然不是正确的方法。我想念什么?

3 个答案:

答案 0 :(得分:1)

不确定bluebird,但是nodejs Promise.all应该可以完成工作:

Promise.all([
    User.create([{ name: 'alice' }]),
    Post.create([{ content: 'foo' }])
]).then(([users, posts]) => {
    const comments = [
        { content: 'bar', user: users[0], post: posts[0] }
    ];    
    return Comment.create(comments);
})

答案 1 :(得分:1)

如果要使用自动引用为数据库添加种子,请使用Seedgoose。 这是最容易使用的播种机。您不需要编写任何程序文件,而只需编写数据文件。并且Seedgoose为您处理智能引用。顺便说一下,我是该软件包的作者和维护者。

答案 2 :(得分:0)

尝试一下即可正常运行:

  

注意: Node Promise.all将确保两个查询都正确执行,然后将结果返回到Array:[Users,Posts],   如果在执行任何查询期间遇到任何错误,则将由Promise.all的catch块来处理。

let queryArray = [];
queryArray.push(User.create([{ name: 'alice' }]));
queryArray.push(Post.create([{ content: 'foo' }]));

Promise.all(queryArray).then(([Users, Posts]) => {
const comments = [
    { content: 'bar', user: Users[0], post: posts[0] }
];   
return Comment.create(comments);
}).catch(Error => {
   console.log("Error: ", Error);
})