Какой самый элегантный способ написания начального сценария для моделей Mon goose, на которые есть ссылки? Я предпочитаю async/await
синтаксис. Я сделал рабочий пример 1:N
, но я считаю, что он может быть написан более элегантно. Например, у меня есть несколько произвольных логик c для ссылки на 3 пользователей с 9 сообщениями, что не хорошо. Я хотел бы видеть лучшее решение и учиться на нем.
Модель пользователя
const userSchema = new Schema(
{
username: {
type: String,
lowercase: true,
unique: true,
required: [true, "can't be blank"],
match: [/^[a-zA-Z0-9]+$/, 'is invalid'],
index: true,
},
email: {
type: String,
lowercase: true,
unique: true,
required: [true, "can't be blank"],
match: [/\S+@\S+\.\S+/, 'is invalid'],
index: true,
},
password: {
type: String,
trim: true,
minlength: 6,
maxlength: 60,
},
name: String,
avatar: String,
messages: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Message' }],
},
{ timestamps: true },
);
Модель сообщения
const messageSchema = new Schema(
{
text: {
type: String,
required: true,
},
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
},
{ timestamps: true },
);
Функция семян
export const seedDb = async () => {
console.log('seeding database...');
await User.deleteMany({});
await Message.deleteMany({});
// create 3 users
const usersPromises = [...Array(3).keys()].map((index, i) => {
const user = new User({
provider: 'email',
username: `user${index}`,
email: `email${index}@email.com`,
password: '123456789',
name: faker.name.findName(),
avatar: faker.image.avatar(),
bio: faker.lorem.sentences(3),
});
if (index === 0) {
user.role = 'ADMIN';
}
return user;
});
await Promise.all(
usersPromises.map(async user => {
await user.save();
}),
);
// create 9 messages
const messagePromises = [...Array(9).keys()].map((index, i) => {
const message = new Message({
text: faker.lorem.sentences(3),
});
return message;
});
await Promise.all(
messagePromises.map(async message => {
await message.save();
}),
);
const users = await User.find();
const messages = await Message.find();
// every user 3 messages
users.map(async (user, index) => {
const threeMessagesIds = messages.slice(index * 3, index * 3 + 3).map(m => m.id);
await User.updateOne({ _id: user.id }, { $push: { messages: threeMessagesIds } });
});
// 0,1,2 message belong to user 0 ...
messages.map(async (message, index) => {
const j = Math.floor(index / 3);
const user = users[j];
await Message.updateOne(
{ _id: message.id },
{
$set: {
user: user.id,
},
},
);
});
};