Mongoose:通过聚合获取对象数组的大小

Posted

技术标签:

【中文标题】Mongoose:通过聚合获取对象数组的大小【英文标题】:Mongoose: get the size of an array of objects with aggregate 【发布时间】:2019-02-07 08:31:35 【问题描述】:

我的收藏中有一份文档:


"_id" : ObjectId("5b8aaaebf57de10e080c9151"),
"user_email" : "temp@temp.com",
"platforms_budget" : [ 
    
        "_id" : ObjectId("5b8aaaebf57de10e080c9154"),
        "platform_id" : "f_01",
        "platform_name" : "Facebook"
    , 
    
        "_id" : ObjectId("5b8aaaebf57de10e080c9153"),
        "platform_id" : "i_01",
        "platform_name" : "Instagram"
    , 
    
        "_id" : ObjectId("5b8aaaebf57de10e080c9152"),
        "platform_id" : "f_02",
        "platform_name" : "Facebook_Adds"

    
],
"__v" : 0

我想通过“user_email”找到特定用户并获取相关“platform_budget”数组的长度。在这种情况下,假设长度为 3。

我的功能是这样的:

var BudgetSchema = require('../models/Budget');

  router.post('/temp', async function (req, res) 
  var length = await BudgetSchema.aggregate(
    [ $match:  user_email: "test@test.com"  ,  $unwind: "$platforms_budget" ,
     $project:  "platforms_budget.count":  $size: '$platforms_budget'   ])

  console.log(length);
)

当我尝试 console.log(length) 时,我得到一个空数组。

我在 *** 上看到了其他答案,例如 this one,但我仍然不明白我做错了什么或如何从响应中提取大小。

如何获得“platforms_budget”数组大小? 谢谢。

【问题讨论】:

你在这里得到光标,你需要在这里使用promise或回调或异步等待 谢谢。我相应地更新了我的问题,但现在我得到了一个空数组。 删除 $unwind 阶段将解决您的问题 是的!就是这个!非常感谢! 【参考方案1】:

假设../models/Budget 导出一个Model,Model#aggregate(Array, Function) 期望管道具有聚合作为一个数组和一个可选的回调函数,该函数被传递一个错误(如果有)和结果(如果有)。

.aggregate([...], function(error, resource) 
    // do what you want here
);

或者您也可以使用Aggregate 对象本身并在其上调用.exec(Function),函数也是回调。

.aggregate([...]).exec(function(error, resource) 
    // do what you want here
);

我个人对about the documentation 的.aggregate(Array, Function) 还是有点困惑。

如果传递了回调,则执行聚合并返回 Promise。如果未传递回调,则返回聚合本身。

听起来,如果通过了回调,仍然会返回一个承诺,但我找不到任何证据表明 .aggregate(Array, Function) on GitHub at all 返回了任何承诺。

【讨论】:

知道了!谢谢!

以上是关于Mongoose:通过聚合获取对象数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象响应对象的猫鼬聚合数组转换为json对象响应

Mongoose 从对象数组中查询倒数第二个项目

如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?

Mongoose:聚合获取数组类型字段的文档并根据特定字段过滤这些文档

如何在猫鼬中将对象字段作为数组获取?

Mongoose 通过 _id 查询对象数组