【问题标题】:Mongoose: how to count a number of schema that other schema refers to?Mongoose:如何计算其他模式引用的模式数量?
【发布时间】:2014-05-09 10:42:40
【问题描述】:

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

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

我想要做的只是知道有多少值有 'exploits' 数组作为响应中的一个字段,这可能吗?在sql中我只需要写“count(field)”并进行“group by”,我该怎么做?

一个例子:

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

提前致谢。

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案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 引擎中工作通常是在“本机”代码中完成的,并且 JavaScript 运算符不可用。但作为本机代码,这些运算符的工作速度非常快。

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

    【讨论】:

      【解决方案2】:

      在发帖之前,您是否尝试过搜索此内容?使用“mongodb count group by”进行简单的谷歌搜索会得到很多结果,这些结果不仅告诉您您已经查看了aggregation framework,而且甚至在诸如thisthis.

      【讨论】:

      • 我当然做了,但老实说,我没有在搜索中写“group by”。我读了这个问题:stackoverflow.com/questions/12451575/… 但是猫鼬向我显示了一个错误。我要检查你的链接。感谢您的回复
      • @Daniel976034 首先尝试提出一种有效的 mongodb 方式,然后再看看如何将其翻译成 mongoose。
      • 好的,知道了。但我有一个问题。 Policies.exploits 是一个数组,我怎样才能得到项目的数量?因为如果我在“$group”语句中写“$exploits.length”,它就不起作用。
      猜你喜欢
      • 2018-09-02
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2015-05-18
      • 2013-12-30
      • 2016-05-29
      相关资源
      最近更新 更多