我在查询中遇到问题,我传递的参数是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"
}
}
]
答案 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将布尔值数组作为参数。您可以使用$map将userReachedLimitedQuantity
转换为检查userId
和quantityBrought
字段的布尔值。
因此,如果任何元素为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;
}