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:通过聚合获取对象数组的大小的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MongoDB 中对聚合查询结果进行分页并获得总文档数(Node.js + Mongoose)?