2016-12-01 2 views
0

Ниже приведены два Mongoose схемы:Как найти поддокументы по критериям + 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 сохраняется обратно EmployeeSchema в employeeDetailsId

В настоящее время существует двунаправленная связь между EmployeeSchema и EmployeeDetailSchema.

UseCase:

Я хочу, чтобы извлечь все сотрудники, которые помечены особым статусом. Предположим, что идентификатор состояния ввода - 1234, после чего я хочу получить всех сотрудников, статус которых равен 1234 в документе EmployeeDetail.

Ниже приводится подход, который я попытался использовать 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); 
     }); 
}; 

Результата, который возвращается пустой массив, хотя есть сотрудники, которые назначены на некоторые статусы. Является ли мой подход к поиску с Мангустасом правильным?

+0

вы используете вспомогательный документ, или с помощью ссылки на данные работника модели для 'employeeDetailsId'? –

+0

Пара других хороших вопросов о MongoDB: Поиск суб-документов по критериям: [Один] (http://stackoverflow.com/questions/16845191) и [Два] (http://stackoverflow.com/questions/21142524). Думал, что это может помочь другим. – BeingSuman

ответ

1

Вы используете ссылку 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); 
     }); 

NB: новообращенный Строка в ObjectId значение req.params.statusId

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

спасибо за ответ человек, я даже знал о '$ lookup'. Прошел через документы MongoDB примерно в том же русском, что наш ответ был очень важен для моего использования. Но выполнение того же результата не принесло результата, его все тот же пустой [] результат. Просто хотел проверить, поддерживает ли Mongoose 'aggregate' с' $ lookup'? Любые справочные документы plz. – BeingSuman

+0

Я использовал его как простой запрос в терминале MongoDB, исключив последнюю проверку в матче, он дал мне желаемый результат: 'db.getCollection ('employees').Совокупный ([ { $ поиска: { от: "employeedetails", localField: "employeeDetailsId", foreignField: "_id", как: "детали" } }, { $ матча: { $ и: [{"details.statusId": {"$ exists": true}}]} } ]); ' – BeingSuman

+0

Но проблема с предыдущим запросом: я удалил проверку состояния для' {"details.statusId ": req.params.statusId}'. При добавлении, что он снова дает такую ​​же старую проблему: 'Fetched 0 records (s)' – BeingSuman

Смежные вопросы