Mongodb比较两个字段匹配的字段的值汇总

时间:2019-01-01 13:33:59

标签: mongodb aggregation-framework

我在查询中遇到问题,我传递的参数是voucherId和userId,我需要检查该用户是否超过了limitedQuantityPerUser。如果是,请排除此凭证。但是我在比较匹配字段时遇到问题,例如,如果voucherId为'aaa',请检查 quantityBrought> limitedQuantityPerUser。

我已经尝试过

vouchers.find({
         'status': {
          $in: ['OP', 'WG', 'LO', 'SO']
        },
        'details.userReachedLimitedQuantity': {
          $ne: userId
        },
      }, fields, {
        sort: {
          'order': 1
        }
      }

但这会给我所有结果,其中列表中的userId不相等。不完全是我所需要的。使用聚合解决是否更好?

示例JSON文件

[{
        "_id": "111",
        "details": {
            "limitedQuantityPerUser": "3",
            "userReachedLimitedQuantity": [{
                    "userId": "aaa",
                    "quantityBrought": "2"
                },
                {
                    "userId": "bbb",
                    "quantityBrought": "1"
                },
                {
                    "userId": "ccc",
                    "quantityBrought": "3"
                }
            ],
            "status": "OP"
        }
    },
    {
        "_id": "222",
        "details": {
            "limitedQuantityPerUser": "2",
            "userReachedLimitedQuantity": [{
                    "userId": "eee",
                    "quantityBrought": "2"
                },
                {
                    "userId": "bbb",
                    "quantityBrought": "1"
                },
                {
                    "userId": "vvv",
                    "quantityBrought": "2"
                }
            ],
            "status": "OP"
        }
    }
]

2 个答案:

答案 0 :(得分:0)

您可以使用下面的汇总检查指定的userId是否超出了定义的限制。

db.vouchers.aggregate([
    {
        $match: {
            $expr: {
                $allElementsTrue: {
                    $map: {
                        input: "$details.userReachedLimitedQuantity",
                        as: "user",
                        in: {
                            $or: [
                                { $ne: [ "$$user.userId", userId ] },
                                { $lte: [ "$$user.quantityBrought", "$details.limitedQuantityPerUser"  ] }
                            ]
                        }
                    }
                }
            }
        }
    }
])

$allElementsTrue将布尔值数组作为参数。您可以使用$mapuserReachedLimitedQuantity转换为检查userIdquantityBrought字段的布尔值。

因此,如果任何元素为false,则表示该用户的quantityBrought大于limitedQuantityPerUser

答案 1 :(得分:0)

没有完美的答案,但我对mongod查询的结果进行了过滤

// Only take matched userId's quantityPurchased
const newResult = result.filter(val => {
  if (!val.details.userReachedLimitedQuantity) {
    return val;
  }
  val.details.userReachedLimitedQuantity= val.details.userReachedLimitedQuantity.filter((o) => {
    return (String(o.userId) == userId)
  });
  if (val.details.userReachedLimitedQuantity[0].quantityBrou < val.details.limitedQuantityPerUser) {
    return val;
  } else {
    return false;
  }