我是 mongoose node.js 和 mongoDB 的新手,我有一个类似于
的数据库架构Project:{
projectName:"String",
projectManager:"String",
task:[{
taskName:"String",
timetakeninhrs:"String"
}]
};
所以我想要的是仅获取具有特定任务名称的任务的详细信息。 我正在编写 sql 脚本,以便您知道我想要什么:
Select taskname,timetakeninhrs from project where taskName ='DB create';
最佳答案
$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 */
]
在回调中,您可以执行一些数据操作来获取仅具有您指定的属性的对象,因此使用 native JavaScript map()
函数用这些字段创建一个新的对象数组
关于arrays - 如何从 Mongoose 数组中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33274927/