mongodb - 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"
}
}
]
解决方案
您可以使用以下聚合来检查指定是否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
转换为此类布尔值检查userId
和quantityBrought
字段。
因此,如果有任何元素,false
则意味着该用户quantityBrought
大于limitedQuantityPerUser
推荐阅读
- .net - “成员”对象引用未设置为对象的实例
- macos - conda activate 命令在 mac 上不起作用
- eclipse-plugin - 带有 log4j2x 的 p2 存储库
- php - 读取具有 31 个不同列的 mysql 表
- javascript - 在特定元素之前添加新行
- reactjs - useState 没有更新状态
- r - 如何在 R 中通过向量编写递归函数?
- flutter - 如何在颤动中显示覆盖在当前屏幕上的进度指示器动画?
- android - 上传我的应用时出现此错误:上传失败 您需要为您的 APK 使用与版本代码 1 不同的版本代码
- lua - 在 Splash 中,如何使用 src 属性附加到 url