Mongoose:如何计算其他模式引用的模式数量?

Posted

技术标签:

【中文标题】Mongoose:如何计算其他模式引用的模式数量?【英文标题】:Mongoose: how to count a number of schema that other schema refers to? 【发布时间】: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 

提前致谢。

【问题讨论】:

【参考方案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,而且甚至在诸如this 和this.

【讨论】:

我当然做了,但老实说,我没有在搜索中写“group by”。我读了这个问题:***.com/questions/12451575/… 但是猫鼬向我显示了一个错误。我要检查你的链接。感谢您的回复 @Daniel976034 首先尝试提出一种有效的 mongodb 方式,然后再看看如何将其翻译成 mongoose。 好的,知道了。但我有一个问题。 Policies.exploits 是一个数组,我怎样才能得到项目的数量?因为如果我在“$group”语句中写“$exploits.length”,它就不起作用。

以上是关于Mongoose:如何计算其他模式引用的模式数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何引用我试图保存在 nestjs/mongoose 中的模式?

如何在 Mongoose 中将一个模式的引用添加到另一个模式并通过 json 插入数据?

创建新模式对象后,Mongoose 引用的字段丢失

如何在 Mongoose 的不同文件中分离模式、方法和静态

在 Mongoose 中引用另一个模式的属性?

Mongoose 嵌套模式与嵌套模型