Mongoose query nested document returns empty array

点点圈 提交于 2019-12-13 06:50:37

问题


I have these schemas:

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

I'm trying to code the Url handler of the API that returns the order details, which looks like this:

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

I'm passing the store id in the Url to quickly check if the logged user has permissions on the store. If not, it returns a 403 status. That said, I think this storeId and the orderId are enough data to get the order, so I'm trying to do a query on a nested document, but it just doesn't work.

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

But the order object is null;

Even when I perform a find, it returns an empty array:

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

I know that I could as well pass the cliendId to the Url and check first if the client belongs to the store, and then retrieve the order from the client, but I think the client part is redundant, don't you think? I should be able to get the order in a secure way by using only these two fields.

What am I doing wrong here?


回答1:


Ok, I found it. The secret was in the match option of populate. The final code looks like this:

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


来源:https://stackoverflow.com/questions/28572839/mongoose-query-nested-document-returns-empty-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!