У меня есть таблица заказов и стол для покупок. Я хочу хранить внешние ключи от попыток в заказах. Я делаю следующим образомКак хранить внешний ключ в мангусте (mongodb)
AttemptSchema.pre('save', function(next) {
var attempt = this;
Order.findById(this.order).exec(function(err, order) {
if (err) next(err);
if (!order) next(new Error('could not load order with order_id:' + order));
order.attempts.push({
attempt: attempt,
runsheet: attempt.runsheet
});
order.save(function(err){
if(err) next(err);
else next();
});
});
});
Когда я печатаю заказ, он печатает следующее. Где добавляются дополнительные _id и id. Есть ли лучший способ сохранить это?
{
"_id": "54a6522b528f452cebe9268c",
"attempts": [
{
"attempt": "54a65d1721d6802c2b4eb04f",
"runsheet": null,
"_id": "54a65d1721d6802c2b4eb050",
"id": "54a65d1721d6802c2b4eb050"
}
]
}
Schemas таблиц являются
var AttemptSchema = new Schema({
order: {
type: Schema.ObjectId,
ref: 'Order',
required:'true',
index: true
},
runsheet: {
type: Schema.ObjectId,
ref: 'Runsheet'
},
});
var OrderSchema = new Schema({
attempts: [{
attempt: {
type: Schema.ObjectId,
ref: 'Attempt'
},
runsheet: {
type: Schema.ObjectId,
ref: 'Runsheet'
}
}]
});
Я думаю, что для цикла наиболее идеально, так как нет запроса db или fs. – raju
Для циклов в node.js значение i необходимо использовать с закрытием, потому что его асинхронный i будет установлен на максимальное значение, прежде чем он будет завершать обработку внутреннего loop.async.each - гораздо более элегантное решение. Вы пробовали? Это работало? – harryy000
Я пробовал с помощью цикла, асинхронного и инфактного, вы можете пропустить этот шаг и сразу добавить попытку заказа. Он все равно покажет еще 2 свойства в массиве попыток в заказах – raju