mongodb - Mongodb聚合从数组中获取所需的对象
问题描述
我的示例文档是:
{
"_id": 1,
"offers": [
{
"id": 12345,
"amount": 100,
"eligibleProducts": [
111,
123,
156
]
},
{
"id": 12346,
"amount": 100,
"eligibleProducts": [
222,
333
]
}
]
}
我想过滤offers
with eligibleProducts
。
如果我eligibleProducts
是 [111, 777, 888] 则返回:
{
"id": 12345,
"amount": 100,
"eligibleProducts": [
111,
123,
156
]
}
我使用$setIsSubset
了聚合,但这是与完整数组进行比较,
"Offers" : { "$filter" : { "input" : "$Offers", "as" : "offer", "cond" : { "$and" : [{ "$setIsSubset" : {[111, 777, 888], "$$offer.eligibleProducts"]}}]}}}
解决方案
我使用了 $setIsSubset 聚合,但这是与完整数组进行比较,
$setIsSubset在这里不起作用,因为当第一个数组是第二个数组的子集时返回 true,包括当第一个数组等于第二个数组时,否则返回 false。
您可以尝试以下方法,
$match
是eligibleProducts
输入中的 id 以过滤主要文档$filter
offers
迭代数组的循环$filter
迭代数组循环eligibleProducts
并检查输入ID中的ID$ne
检查上述过滤结果是否 [] 为空然后返回对象
db.collection.aggregate([
{
$match: {
"offers.eligibleProducts": {
$in: [111, 777, 888]
}
}
},
{
$project: {
offers: {
$filter: {
input: "$offers",
cond: {
$ne: [
{
$filter: {
input: "$$this.eligibleProducts",
cond: { $in: ["$$this", [111, 777, 888]] }
}
},
[]
]
}
}
}
}
}
])
推荐阅读
- android - 在导航抽屉中单击时,Google 地图不可见。logcat中没有显示错误
- php - symfony 学说验证实体关系错误
- node-sass - Mixin 不能在控制指令或其他 mixin 中定义
- java - 如何忽略zuul中的路线?
- reactjs - React router v4 - 在导航时保留查询参数
- angular - 角度 4 中 AWS API 网关的 CORS 问题
- android - 获取一周的开始和结束日期
- keystore - 如何重新加载 Java 安全 KeyStore 的密钥?
- ios - Firebase iOS Unity 卡在“将托管程序集转换为 C++”
- elasticsearch - 弹性查询分组依据