Оператор $elemMatch
проекция пригодится для этого:
Project
.where('task.taskName', 'DB create') // or where('task.taskName').equals('DB create').
.select({_id: 0, task: {$elemMatch: {'taskName': 'DB create'}})
.exec(function(err, docs){
var tasks = docs.map(function(doc){ return doc.task[0]; });
console.log(tasks[0].taskName); // 'DB create'
console.log(tasks[0].timetakeninhrs); // '3'
});
В выше, where()
метод действует как статический вспомогательный метод модели Mongoose, который создает запрос с использованием синтаксиса цепочки, вместо указания объекта JSON. Так
// instead of writing:
Project.find({ 'task.taskName': 'DB create' }, callback);
// you can instead write:
Project.where('task.taskName', 'DB create');
// or
Project.where('task.taskName').equals('DB create');
, а затем цепь метод select()
для проецирования «задачи» поле массива с помощью $elemMatch
. В методе exec()
(который выполняет запрос асинхронно) вам необходимо передать обратный вызов, который следует за шаблоном callback(error, results)
. Какие результаты зависит от работы: Для findOne()
это потенциально-нуль один документ, find()
перечня документов, count()
количества документов, update()
количества документов, пострадавшее и т.д. В этом случае это возвращает массив документов в формате:
[
/* 0 */
{
"task" : [
{
"taskName" : "DB create",
"timetakeninhrs" : "3"
}
]
},
/* 1 */
{
"task" : [
{
"taskName" : "DB create",
"timetakeninhrs" : "9"
}
]
}
/* etc */
]
в обратном вызове вы можете сделать немного манипулирования данных, чтобы получить объект, который имеет только те свойства, которые вы указали, следовательно, использование нативного JavaScript map()
функции, чтобы создать новый массив объектов с этими полями