2016-07-19 116 views
1

所以我遇到了一個奇怪的問題,一直讓我瘋狂。我有一個商店的模式,代表店面攜帶某些製造商的產品,我也有一個模式。 Store模式的其中一個屬性是由ObjectId引用的製造商對象的數組。MongoDB參考不保存(貓鼬)

基本上,我想要完成的是當創建一個新的Store文檔時,我想要遍歷所有現有的Manufacturer文檔,並將每個文檔的_id屬性添加到Store文檔中的引用數組。

最奇怪的是,在將所有_id推入陣列後,我在新創建的Store模型上調用.save()方法後,打印出的調試結果顯示結果完全保存了我想要的結果。但是,當我打電話來從我的數據庫中提取記錄時,製造商陣列完全是空的,並且沒有任何ObjectId被引用填充。

我不知道在哪裏,從這裏走,任何人可以幫助?

感謝

Schema定義:

var Schema = mongoose.Schema; 

//create a schema for database 
var storeSchema = new Schema({ 
    "number": String, 
    "state": String, 
    "zip": String, 
    "city": String, 
    "street": String, 
    "manufacturers": [{ 
    "type": mongoose.Schema.Types.Mixed, 
    "ref": "Manufacturer" 
    }] 
}); 

var manufacturerSchema = new Schema({ 
    "name": String, 
    "country": String, 
    "products": [{ 
    "type": mongoose.Schema.Types.ObjectId, 
    "ref": "Product" 
    }] 
}); 

var Product = mongoose.model("Product", productSchema); 
var Manufac = mongoose.model("Manufacturer", manufacturerSchema); 

創建一個存儲文件:

app.put("/api/v1.0/stores", function(req, res){ 
    console.log("PUT request received at /stores."); 
    if(Object.keys(req.body).length < 5){ 
    //not enough parameters 
    console.log("Not enough parameters were supplied."); 
    res.sendStatus(400); 
    } 
    //create a new database product document and save to database 
    var savedID; 
    var params = req.body; 
    var tmpStore = new Store({ 
    "number": params.number, 
    "state": params.state, 
    "zip": params.zip, 
    "city": params.city, 
    "street": params.street 
    }); 
    //find all manufacturers 
    Manufac.find({}, function(err, result){ 
    result.forEach(function(value){ 
     tmpStore.manufacturers.push(value._id); 
    }); 
    }); 

    tmpStore.save(function(err, result){ 
    if(err) { 
     console.log("Error PUTing store!"); return; 
    } 
     console.log("Saved successfully: " + result); 
    }); 
    res.sendStatus(200); 
}); 

輸出:

從捲曲
App listening on port 8080. 
PUT request received at /stores. 
Saved successfully: { __v: 0, 
    number: '1', 
    state: 'OR', 
    zip: '97333', 
    city: 'Corvallis', 
    street: '1680 Washington St.', 
    _id: 578df6a679e28aea6b84bec8, 
    manufacturers: 
    [ 578dae80a8f8ec3266a5d956, 
    578dd1918caa17b467b7caee, 
    578dd19f8caa17b467b7caef, 
    578dd1bd8caa17b467b7caf0 ] } 

JSON GET

{ 
    "_id": "578df6a679e28aea6b84bec8", 
    "number": "1", 
    "state": "OR", 
    "zip": "97333", 
    "city": "Corvallis", 
    "street": "1680 Washington St.", 
    "__v": 0, 
    "manufacturers": [] 
} 

服務器端的GET請求代碼:

app.get("/api/v1.0/stores", function(req, res) { 
    console.log("Get received at /stores"); 
    Store 
     .find({}) 
     .populate("manufacturers") 
     .exec(function(err, result){ 
     if(err){ 
      console.log("Error fetching stores!"); return; 
     } 
     res.json(result); 
     }); 
    }); 

回答

0

我想你應該有tmpStore.save查找功能中。由於它是異步的,它將在find函數回調之前移動到save函數。

我想你應該有類似

Manufac.find({}, function(err, result){ 
    result.forEach(function(value){ 
     tmpStore.manufacturers.push(value._id); 
    }); 
tmpStore.save(function(err, result){ 
    if(err) { 
     console.log("Error PUTing store!"); return; 
    } 
     console.log("Saved successfully: " + result); 
    }); 
    }); 

我認爲這應該工作。

+0

謝謝!我甚至沒有考慮過''save()''函數將會擊敗''find()''調用。 –