Mongoose聚合返回空结果

时间:2015-05-22 10:00:18

标签: node.js mongodb mongoose

我遇到了mongoose聚合请求的问题。

这让我疯狂,因为我无法在任何地方找到解决方案。我非常感谢任何支持。

架构:

var EvalSchema = new Schema({
    modified: {type: Date, default: Date.now},
    created : {type: Date, default: Date.now},
    username: {type: String, required: true},
    item: {type: String, required: true},
    criteria: [{
        description: {
            type: String
        },
        eval: {
            type: Number
        }
    }]
});
mongoose.model('Eval', EvalSchema);

我正在使用聚合来计算给定项目的每个标准的评估总和。

Eval.aggregate([{
    $match: {
        item: item.id
    }
}, {
    $unwind: "$criteria"
}, {
    $group: {
        _id: "$criteria.description",
        total: {
            $sum: "$criteria.eval"
        },
        count: {
            $sum: 1
        }
    }
}, {
    $project: {
        total: 1,
        count: 1,
        value: {
            $divide: ["$total", "$count"]
        }
    }
}], function(err, result) {
    if (err) {
        console.log(err);
    }
    console.log(result);
});

结果总是空的....

我正在记录应用程序中所有mongoose fire的查询。当我在Mongodb中运行查询时,它返回正确的结果。

coll.aggregate([{
    '$match': {
        item: 'kkkkkkkkkkk'
    }
}, {
    '$unwind': '$criteria'
}, {
    '$group': {
        _id: '$criteria.description',
        total: {
            '$sum': '$criteria.eval'
        },
        count: {
            '$sum': 1
        }
    }
}, {
    '$project': {
        total: 1,
        count: 1,
        value: {
            '$divide': ['$total', '$count']
        }
    }
}])

结果:

{
    result: [{
        "_id": "Overall satisfaction",
        "total": 4,
        "count": 1,
        "value": 4
    }, {
        "_id": "service",
        "total": 3,
        "count": 1,
        "value": 3
    }, {
        "_id": "Quality",
        "total": 2,
        "count": 1,
        "value": 2
    }, {
        "_id": "Price",
        "total": 1,
        "count": 1,
        "value": 1
    }],
    ok: 1
}

该模型引用了正确的集合。

谢谢:)

1 个答案:

答案 0 :(得分:9)

$.ajax('/url/of/your/file.json/on/the/server', { success: function(content) { var json = JSON.parse(content); var resultArray = Object.keys(json) .map(function(key) { return [key,json[key]]; }) .reduce(function(container,nextArray) { container.push(nextArray); return container; }, []); consle.log(resultArray); // resultArray is what you need } }); 函数中的item.id是一个字符串,因此您需要将其转换为 ObjectID ,如下所示:

$match

您可以在GitHub aggregate上查看此问题以获取更多详细信息。