Mongoose:如何计算其他模式引用的一些模式?

时间:2014-03-30 00:29:15

标签: node.js mongodb mongoose aggregation-framework

正如我上面所写,我有一个模式引用另一个不同的模式。这些是:

exports.Policies = new mongoose.Schema({
   name: String,
   description: String,
   exploits: [ {type : mongoose.Schema.ObjectId, ref : 'exploit', required: true} ]
});
exports.exploit = new mongoose.Schema({
    name: String,
    type: String,
    required: [String]
});

我想要做的只是知道有多少价值观具有多少价值?'数组作为响应中的字段,这可能吗?在sql中我只能写" count(field)"通过"制作一个"组,我该怎么做?

一个例子:

{
    "name" : "mmmmmm",
    "description" : "jjjj",
    "_id" : ObjectId("533721b91a985b883399cdc2"),
    "n_exploits" : 2 
}

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您不需要过滤数组内容,实际上只有$size运算符。

假设您的架构模型名为"策略"然后通过使用.aggregate()

实现以下目标
policies.aggregate([
    { "$unwind": "$exploits" }
    { "$group": {
        "_id": "$_id",
        "count": { "sum": 1 }
     }}
],function(err,doc) {

});

所以这可以通过展开数组然后计算重新分组时生成的元素数来实现。

在将来的版本中,有一个新的$size运算符,因此您可以跳过这些阶段并只使用项目:

policies.aggregate([
    { "$project": {
       "count": { "$size": "$exploits" }
    }}
],function(err,doc) {

});

或者以$group$sum使用它来跨文档添加数组。

但是现在您执行$unwind$sum操作。在mongodb引擎内部工作通常在" native"代码和JavaScript运算符不可用。而且作为本机代码,这些运算符的工作速度非常快。

另请参阅aggregation operator reference了解您可能希望做的其他事情。

答案 1 :(得分:-1)

你在发布之前试过这个吗?一个简单的谷歌搜索单词“mongodb count group by”给出了很多结果,这不仅告诉你你已经看了aggregation framework,而且还给你一些例子,甚至像你一样{{} 3}}和this