2015-02-17 182 views
0

我有這些模式:貓鼬查詢嵌套文檔返回空數組

var Store = mongoose.model('Store', new Schema({ 
    name: String 
})); 

var Client = mongoose.model('Cllient', new Schema({ 
    name: String, 
    store: { type: Schema.ObjectId, ref: 'Store' } 
})); 

var Order = mongoose.model('Order', new Schema({ 
    number: String, 
    client: { type: Schema.ObjectId, ref: 'Client' } 
})); 

我試圖代碼,返回訂單詳細信息的API,它看起來像這樣的URL處理器:

app.get('/api/store/:storeId/order/:orderId', function (...)); 

我在Url中傳遞商店標識以快速檢查記錄的用戶是否具有商店權限。如果不是,則返回403狀態。這就是說,我認爲這個storeId和orderId是足夠的數據來獲得訂單,所以我試圖對嵌套文檔進行查詢,但它不起作用。

Order.findOne(
    { 'client.store': req.params.storeId, _id: req.params.orderId }, 
    function (err, order) { ... }); 

但是order對象爲null;

即使當我執行查找,它返回一個空數組:

Order.find(
    { 'client.store': req.params.storeId }, 
    function (err, results) { ... }); 

我知道我可以在cliendId以及傳遞給url並首先檢查客戶端所屬的存儲,然後從客戶端取回訂單,但我認爲客戶端部分是多餘的,您不覺得嗎?我應該能夠通過僅使用這兩個字段以安全的方式獲得訂單。

我在這裏做錯了什麼?

+0

您需要在'order'對象內'填充'引用的'store'對象。 - 你可以在這裏看到例子 - http://mongoosejs.com/docs/populate.html – BatScream 2015-02-17 23:09:26

回答

0

好的,我找到了。祕密在於填充的匹配選項。最終代碼如下所示:

Order 
    .findOne({ _id: req.params.orderId }) 
    .populate({ path: 'client', match: { store: req.params.storeId } }) 
    .exec(function (err, order) { ... });