【问题标题】:MongoDB match criteria in aggregate acting unexpectedlyMongoDB 在聚合中的匹配条件意外地出现
【发布时间】: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 仍然返回一个空白数组

标签: node.js mongodb mongoose


【解决方案1】:

id 出于某种原因需要转换为字符串。我不明白为什么会这样,但只需添加 "userID": id + '' 即可使查询按预期运行。

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2022-06-16
    • 2020-06-29
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多