首页 > 解决方案 > Mongodb比较两个字段与匹配字段值聚合

问题描述

我的查询有问题,我传递的参数是凭证Id 和userId,我需要检查该用户是否超过limitedQuantityPerUser。如果是,请排除此优惠券。但是我在比较匹配字段时遇到问题,例如如果凭证Id 是'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"
        }
    }
]

标签: mongodbaggregation-framework

解决方案


您可以使用以下聚合来检查指定是否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将一个布尔值数组作为参数。您可以使用$map将您的userReachedLimitedQuantity转换为此类布尔值检查userIdquantityBrought字段。

因此,如果有任何元素,false则意味着该用户quantityBrought大于limitedQuantityPerUser


推荐阅读