如何从mongoosearrays中获取数据?

我是新来的mongoose node.js和mongoDB,我有一个db模式像

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模型的静态帮助方法,它使用链接语法构build查询,而不是指定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()方法(asynchronous执行查询)中,您需要传入一个跟踪模式callback(error, results) 。 什么结果取决于操作:对于findOne()它是一个可能为null的单个文档, find()文档列表, count()文档数量, update()受影响的文档数量等。这种情况下返回格式为:

 [ /* 0 */ { "task" : [ { "taskName" : "DB create", "timetakeninhrs" : "3" } ] }, /* 1 */ { "task" : [ { "taskName" : "DB create", "timetakeninhrs" : "9" } ] } /* etc */ ] 

在你的callback中,你可以做一些数据操作来获得一个只有你指定的属性的对象,因此使用本地JavaScript map()函数来创build一个包含这些字段的新对象数组

我创build这个例子可以帮助你:

 var async=require('async'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var uri = 'mongodb://localhost/myDb'; mongoose.connect(uri); // define a schema var ProjectSchema = new Schema({ projectName: "String", projectManager: "String", task: [{ taskName: "String", timetakeninhrs: "String" }] }); // compile our model var Project = mongoose.model('Project', ProjectSchema); // create a documents var Project01 = new Project({ projectName: "Project01", projectManager: "Manager01", task: [{ taskName: "tsk01_Project01", timetakeninhrs: "1111-1111" }, { taskName: "tsk02_Project01", timetakeninhrs: "1111-2222" }, { taskName: "tsk03_Project01", timetakeninhrs: "1111-3333" }, { taskName: "tsk04_Project01", timetakeninhrs: "1111-4444" }] }); var Project02 = new Project({ projectName: "Project02", projectManager: "Manager02", task: [{ taskName: "tsk01_Project02", timetakeninhrs: "2222-1111" }, { taskName: "tsk02_Project02", timetakeninhrs: "2222-2222" }, { taskName: "tsk03_Project02", timetakeninhrs: "2222-3333" }, { taskName: "tsk04_Project02", timetakeninhrs: "2222-4444" }] }); //delete existing documents and create them again Project.remove({}, function() { Project01.save(function() { Project02.save(function() { //for example we find taskName: "tsk03_Project02" Project.find({'task': {$elemMatch: {taskName: "tsk03_Project02"}}},'task.taskname task.timetakeninhrs',function(err, docs) { if (!err) { console.log(docs); } }); }); }); });