簡體   English   中英

如何通過Criteria + Mongoose / MongoDB查找子文檔

[英]How to find Sub-Documents by Criteria + Mongoose / MongoDB

以下是兩種貓鼬模式:

EmployeeSchema:

var EmployeeSchema = new Schema({
    name : String,
    employeeDetailsId: {
        type: Schema.Types.ObjectId,
        ref: 'employeedetails'
    }
});

EmployeeDetailSchema:

var EmployeeDetailSchema = new Schema({
    employeeId: {
        type: Schema.Types.ObjectId,
        ref: 'employee'
    },
    statusId: {
        type: Schema.Types.ObjectId,
        ref: 'status'
    }
});

EmployeeDetailSchema數據按需保存,例如將特定狀態分配給Employee時。 在這種情況下,一旦保存了EmployeeDetail文檔,則將相應的EmployeeDetailID作為employeeDetailsId保存回EmployeeSchema。

現在,EmployeeSchema和EmployeeDetailSchema之間存在雙向關系。

用例:

我想獲取所有標記有特定狀態的員工。 說輸入狀態ID為1234那么我想在EmployeeDetail文檔中獲取其狀態ID為1234所有員工。

以下是我嘗試使用Mongoose的方法:

exports.getEmployeesByStatus = function (req, res) {
    console.log('Status ID : ' + req.query.statusId);

    EmployeeModel.find({'employeeDetailsId.statusId': {$eq: mongoose.Types.ObjectId(req.params.statusId)}})
        .exec(function (err, result) {
            if (err)res.send('400', {message: 'Unable to fetch employees data by status. Please try again later'});

            res.jsonp(result);
        });
};

盡管有些員工被分配了某些狀態,但返回的結果是空數組。 我對貓鼬的查詢方法正確嗎?

您正在使用的參考EmployeeDetailSchemaemployeeDetailsId根據您的架構設計。 因此您無法在沒有填充的情況下直接比較參考模型字段。 您應該先填充,然后比較和過濾文檔,或者用戶aggregate功能可以實現您的目標。

可以試試這個:

EmployeeModel.aggregate([
      {$lookup: {from: 'employeedetails', localField: 'employeeDetailsId',foreignField: '_id',as: 'details'}},
      {$match: { $and:[{ "details.statusId": { "$exists": true } },{"details.statusId": req.params.statusId}]} }
    ]).exec(function (err, result) {
            if (err) return res.send('400', {message: 'Unable to fetch employees data by status. Please try again later'});

            return res.jsonp(result);
        });

注意:String轉換為ObjectId的值為req.params.statusId

{$match: {$and: [{"details.statusId": {"$exists": true}}, {"details.statusId": mongoose.Types.ObjectId(req.params.statusId)}]}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM