2015-02-17 2 views
0

У меня есть эти схемы:Mongoose запрос вложенный документ возвращает пустой массив

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' } 
})); 

Я пытаюсь код обработчика Url от API, который возвращает детали заказа, который выглядит следующим образом:

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.find(
    { 'client.store': req.params.storeId }, 
    function (err, results) { ... }); 

Я знаю, что я мог бы так же пройти cliendId к адресу и проверить первый, если клиент входит в магазин, а затем получить заказ от клиента, но я думаю, что часть клиента лишняя, не так ли? Я должен иметь возможность получить заказ безопасным способом, используя только эти два поля.

Что я здесь делаю неправильно?

+0

Вам нужно «заполнить» указанный объект 'store' в объекте' order'. - Здесь вы можете увидеть примеры - http://mongoosejs.com/docs/populate.html – BatScream

ответ

0

Хорошо, я нашел. Секрет был в матче. Окончательный код выглядит так:

Order 
    .findOne({ _id: req.params.orderId }) 
    .populate({ path: 'client', match: { store: req.params.storeId } }) 
    .exec(function (err, order) { ... }); 
Смежные вопросы