【发布时间】:2018-08-24 19:29:01
【问题描述】:
我目前正在处理包含此类文档的集合
{
"_id": {
"$oid": "5aa8665dcfe5305814e6dd90"
},
"userID": "5aa71af7b562de0c690eb6e0",
"rebate": 64,
"status": "approved"
}
我正在运行的查询如下:
var id = "5aa71af7b562de0c690eb6e0";
Warranty.aggregate(
[
{
$match: {
"userID": id,
"status": "approved"
}
},
{
$group: {
"_id": null,
"total": {
$sum: "$rebate"
}
}
}
], function(err, sum) {
if (err) throw err;
res.send(sum);
});
目前,这是返回[]
预期结果是[ { "_id": null, "total": 64 } ]
我也尝试将变量 id 转换为 ObjectId,如下所示:
"userID": mongoose.Types.ObjectId(id) 结果仍然是一个空数组。
有趣的是,如果我删除匹配的“userID”行,这将起作用并返回[ { "_id": null, "total": 64 } ],但我需要将查询限制为仅限活动用户。
我是 Mongo 聚合的新手。
可能的解决方案
出于某种原因,"userID": id + '', 解决了这个问题。我真的不明白为什么;有人能向我解释为什么会这样吗?我会假设,因为 id 由字母数字字符组成,所以它已经是一个字符串,对吧?
【问题讨论】:
-
你的比赛阶段是什么?将用户 ID 转换为对象 ID
-
id 值是如何准备的?试试
"userID": mongoose.Types.ObjectId(id) -
Is是从前端传过来的String。它就在那里,因为我在上面的代码之前记录了它。
-
是的,在发送到聚合之前将字符串转换为 objectid,就像我上面描述的那样
-
添加 mongoose.Types.ObjectId 仍然返回一个空白数组