2015-10-22 31 views
2

我是新來的貓鼬的Node.js和MongoDB,我有這樣如何從貓鼬陣列中獲取數據?

Project:{ 
    projectName:"String", 
    projectManager:"String", 
    task:[{ 
      taskName:"String", 
      timetakeninhrs:"String" 
    }] 
}; 

一個DB模式所以我要的是得到特別任務名稱任務的唯一細節。 我寫的SQL腳本,這樣你就可以知道我想要什麼:

Select taskname,timetakeninhrs from project where taskName ='DB create'; 

回答

0

$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()函數來創建對象的一個​​新的陣列

0

我創建這個例子中這些字段,可以幫助你:

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); 
       } 
      }); 
     }); 
    }); 
});