2016-08-25 77 views
0

嘿,我有一些問題得到一個API我正在做的數據,這是我想要存儲項目的數組的事情 在我的模型,它是一個進入產品列表,所以我測試的API,我讓我的路由器與邏輯的一些錯誤,我是通過郵寄的物品,都具有相同的密鑰,但不同的值,在控制檯打印出來的這樣,我需要他們,但是當我試圖讓他們到一個數組,甚至當我試圖讓一個它給我的錯誤。檢索值,如果值是一個列表/陣列

這裏的項目模型:

var itemSchema = = new mongoose.Schema({ 
    name: String, 
    details: String, 
    quantity: SchemaTypes.Double, 
    created_at: {type: Date, default: Date.now}, 
    last_updated: {type: Date, default: Date.now} 
}) mongoose.model('Item', itemSchema); 

這裏的收入模式:

var itemsIncomeSchema = new Schema({ 
    user: {type: schemaTypes.ObjectId, ref: 'User'}, 
    sender: String, 
    created_at: {type: Date, default: Date.now()}, 
    items: [Item] 
}) mongoose.model('ItemIncome', itemsIncomeSchema); 

我選擇將收入模式這種方式,因爲我想擁有的所有項目的列表但我想有一個進入的註冊表,所以我不想使用裁判。 (類似多對多)

反正問題是在這裏,當我通過API測試模型,我在後發送的值是這樣的:

sender=sender_name&items=57b694c626a4741c2f4bf6fd&items=57b694c626a4741c2f4bffff ... 

,並在後在我的路由器的方法我完全獲取數據,它甚至在控制檯上打印,但我不知道如何使項目數組或如何從項目的數據,因爲我需要去尋找_id的我要送,也如果不能確保我正確地送他們,因爲我不知道我是否會通過只有_id或者我會通過整個項目。

這裏的帖子:

.post(function(req, res){ 
var entry = new itemEntry(); 
var user = req.user; 
//var items= req.body.items; <<tried like this but no success 
console.log('items: '+req.body.items) 
for (var item in req.body.items) { 
    console.log('item: '+item); //it prints item: 0...23 also tried with a toString 
} 
entry.user = user._id; 
entry.items= items; 
entry.save(function(err, entry){ 
    if(err) 
    return res.send(500, err); 
    return res.json(entry); 
}); 
}) 
+0

你在查詢中有'items',但正在處理'req.body.products' ?.目前還不清楚您的數據是如何發送的。嘗試'console.log(req.body)'看看你得到了什麼。 – cyberwombat

+0

對不起的錯字,它是返回這個「{項目:['57b694c626a4741c2f4bf6fd','57b694c626a4741c2f4bf6ff']}」這是我發送的ID – Driff

回答

0

什麼是ItemEntry?它應該是ItemIncome?在這種情況下,改變你的架構參考模型項:

items: [{type: schemaTypes.ObjectId, ref: 'Item'}] 

然後在你的代碼:

entry.items = req.body.items; 

更新:基於您的評論,我認爲你的方案需要一點點的工作。首先,你不能創建一個具有相同ID的新項目,這是行不通的。但是,如果你的目的是要參考現有項目,但有不同的數量,那麼你要調整你的模式不具有數量字段作爲項目的一部分,而是作爲ItemIncome的一部分:

var itemSchema = = new mongoose.Schema({ 
    name: String, 
    details: String, 
    created_at: {type: Date, default: Date.now}, 
    last_updated: {type: Date, default: Date.now} 
}) mongoose.model('Item', itemSchema); 
Here's the income model: 

var itemsIncomeSchema = new Schema({ 
    user: {type: schemaTypes.ObjectId, ref: 'User'}, 
    sender: String, 
    created_at: {type: Date, default: Date.now()}, 
    items: [{ 
    quantity: quantity: SchemaTypes.Double, 
    item: {type: schemaTypes.ObjectId, ref: 'Item'} 
    }] 
}) mongoose.model('ItemIncome', itemsIncomeSchema); 

您所提供的數據看起來像:

items=57b694c626a4741c2f4bf6fd&items=57b694c626a4741c2f4bf6‌​ff&quantity=100&quan‌​tity=20" and now i'm recieving this " { items: [ '57b694c626a4741c2f4bf6fd', '57b694c626a4741c2f4bf6ff' ], quantity: [ '100', '20' ] } 

然後:

var items = [] 
for(var i = req.body.items.length - 1; i >= 0; i --) { 
    items.push({ quantity: req.body.quantity[i], item: req.body.items[i] }) 
} 
entry.items = items 

我會建議通過你的數據作爲JSON對象,如果你能。這將是潛在的更強大的,你可以通過共同的數量和項目ID,而不是2個獨立的數組,你現在正在做的:

postdata: { 
    items: [{ 
    id: '57b694c626a4741c2f4bf6fd', 
    quantity: 100 
    }, { ... }] 
} 

Express將有它可作爲在req.body場中的目標。

如果您需要創建新項目,那麼您將需要先創建並保存每個項目,獲取它們的ID然後分配這些項目。您可以使用async庫來幫助或使用Promise。

+0

是的itemEntry是ItemIncome,好吧,但不會只是參考項目項目架構?與項目模式具有的值?以及如果我想將項目存儲爲新項目,但在itemIncome中使用相同的ID和不同的數量呢?我是否會參考ref?因爲我的理解是,它會引用itemSchema – Driff

+0

中的項目謝謝你的回覆,我要測試你的建議,我以前想過這樣做,但我認爲我看到了某處我可以存儲該項目在數組中,而不是參考,但是我沒有保存的項目,因爲它給我錯誤添加數據中的數據,因爲我不知道這是否是正確的方法(按照我上面解釋的方式傳遞項目)但我不知道任何其他方式。 – Driff

+0

無論您想存儲物品還是參考,都取決於您的設置。您通常希望避免重複數據。如果發票上的每個項目都是真正唯一的,則在發票模型中創建該項目,但如果它與其他發票可能共享的項目相關,那麼參考可能更適合。在我的更新中顯示的設置將成爲電子商務設置的一個典型例子,其中訂單具有對具有自定義數量的產品的引用。 – cyberwombat