2015-10-22 2 views
2

Я новичок в мангуст Node.js и MongoDB, у меня есть БД схема, какКак получить данные из массива в мангусте?

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

Так что я хочу, чтобы получить только деталь задачи с определенным именем задачи. Я пишу сценарий 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); 
       } 
      }); 
     }); 
    }); 
}); 
Смежные вопросы