2015-01-02 2 views
-1

У меня есть таблица заказов и стол для покупок. Я хочу хранить внешние ключи от попыток в заказах. Я делаю следующим образомКак хранить внешний ключ в мангусте (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' 
    } 
    }] 
}); 

ответ

0

Это не правильный вариант использования для async.series, и его не используется correctly.For обходе, хотя массив объектов, async.each будет лучшим выбором. Попробуйте ниже, он должен решить вашу проблему.

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)); 
     var isPresent = false; 
     async.each(order.attempts, function(each_order_attempt, callback) { 
      if (each_order_attempt._id === attempt._id) isPresent = true; 
      callback();  //calls the next value of array object 
     }, function(err) { //called finally when all of them are done 
      if (!isPresent) { 
       order.attempts.push({ 
        attempt: attempt, 
        runsheet: attempt.runsheet 
       }); 
      } 
      order.save(function(err) { 
       if (err) next(err); 
       else next(); 
      }); 
     }); 
    }); 
}); 
+0

Я думаю, что для цикла наиболее идеально, так как нет запроса db или fs. – raju

+0

Для циклов в node.js значение i необходимо использовать с закрытием, потому что его асинхронный i будет установлен на максимальное значение, прежде чем он будет завершать обработку внутреннего loop.async.each - гораздо более элегантное решение. Вы пробовали? Это работало? – harryy000

+0

Я пробовал с помощью цикла, асинхронного и инфактного, вы можете пропустить этот шаг и сразу добавить попытку заказа. Он все равно покажет еще 2 свойства в массиве попыток в заказах – raju

Смежные вопросы