如何从mongoose中的数组中获取数据?

3

我是mongoose、node.js和mongoDB的新手,我有一个数据库模式如下:

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

我想要的是仅获取特定任务名称的任务详细信息。我正在编写 SQL 脚本,以便您了解我的需求:

Select taskname,timetakeninhrs from project where taskName ='DB create';
2个回答

1

使用$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投影'task'数组字段。在exec()方法中(异步执行查询的方法),需要传入一个回调函数,其遵循callback(error, results)的模式。结果取决于操作:对于findOne(),它是一个可能为空的单个文档,对于find(),它是一组文档,对于count(),它是文档数量,对于update(),它是受影响的文档数量等。在这种情况下,它返回格式为数组的文档。保留html标签。
[
    /* 0 */
    {
        "task" : [ 
            {
                "taskName" : "DB create",
                "timetakeninhrs" : "3"
            }
        ]
    },
    /* 1 */
    {
        "task" : [ 
            {
                "taskName" : "DB create",
                "timetakeninhrs" : "9"
            }
        ]
    }
    /* etc */
]

在回调函数中,您可以进行一些数据操作,以获取仅具有您指定属性的对象,因此使用本地JavaScript map() 函数创建具有这些字段的新对象数组。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接