[英]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);
});
};
盡管有些員工被分配了某些狀態,但返回的結果是空數組。 我對貓鼬的查詢方法正確嗎?
您正在使用的參考EmployeeDetailSchema
為employeeDetailsId
根據您的架構設計。 因此您無法在沒有填充的情況下直接比較參考模型字段。 您應該先填充,然后比較和過濾文檔,或者用戶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.