Правильный способ посева MongoDB со ссылками через мангуста - PullRequest
0 голосов
/ 05 июля 2018

У меня есть три схемы, одна из которых ссылается на две другие:

userSchema

{ name: String }

postSchema

{ content: String }

commentSchema

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

Как я могу заполнить эту базу данных разумным, масштабируемым способом? Даже при использовании обещаний синей птицы писать быстро становится кошмаром.

Моя попытка до сих пор включает в себя несколько вложенных обещаний, и ее очень трудно поддерживать:

User
.create([{ name: 'alice' }])
.then(() => {
    return Post.create([{ content: 'foo' }])
})
.then(() => {
  User.find().then(users => {
    Post.find().then(posts => {
      // `users` isn't even *available* here!
      Comment.create({ content: 'bar', user: users[0], post: posts[0] })
    })
  })
})

Это явно не правильный способ сделать это. Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Попробуйте, это будет работать нормально:

Примечание: Узел Promise.all проверит, что оба запроса выполнены правильно, а затем вернет результат в массиве: [Users, Posts], Если во время выполнения какого-либо запроса вы получите ошибку, она будет обработана блоком catch файла Promise.all.

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);
})
0 голосов
/ 07 мая 2019

Если вы хотите заполнить базу данных автоматически ссылками, используйте Seedgoose . Это самая простая сеялка для вас. Вам не нужно писать какие-либо программные файлы, а только файлы данных. И Seedgoose обрабатывает умные ссылки для вас. И, кстати, я являюсь автором и сопровождающим этого пакета.

0 голосов
/ 05 июля 2018

Не уверен насчет bluebird, но узелjj 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);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...