【问题标题】:How to get data from array in mongoose?如何从猫鼬的数组中获取数据?
【发布时间】:2016-01-21 08:55:36
【问题描述】:

我是 mongoose node.js 和 mongoDB 的新手,我有一个类似

的数据库架构
Project:{
    projectName:"String",
    projectManager:"String",
    task:[{
           taskName:"String",
           timetakeninhrs:"String"
    }]
};

所以我想要的是只获取具有特定任务名称的任务的详细信息。 我正在编写 sql 脚本,以便您知道我想要什么:

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

【问题讨论】:

    标签: arrays node.js mongodb mongoose


    【解决方案1】:

    我创建了这个可以帮助你的例子:

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

    【讨论】:

      【解决方案2】:

      $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() 函数来创建一个新的数组具有这些字段的对象

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2020-03-10
        • 2020-01-02
        • 2020-06-28
        • 2016-07-30
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多