【发布时间】:2020-07-10 03:31:23
【问题描述】:
我的 MongoDB 数据结构如下所示:
{
users: [{
userref: "User1",
results: [{
testref: "TEST1",
history: [{
score: 10
}, {
score: 15
}]
}, {
testref: "TEST2",
history: [{
score: 2
}, {
score: 1
}]
}]
}]
}
我有一组用户,每个用户都有一组结果(每个测试一个结果对象),并且在每个结果中,有一组历史分数的历史记录。
我需要做的是“返回 TEST1 的最新分数为 X 且 TEST2 的最新分数为 Y 的所有用户的 userref”。未完成其中一项或多项测试的用户不应被退回。 “最近的”是指数组中的最后一个。
我假设我需要使用聚合,但我对此完全陌生,所以可以通过一些帮助来做。
这是我迄今为止尝试过的,它有效,但它只匹配TEST1 = 15的条件,我也希望它匹配条件TEST2 = 1。
[{$unwind: {
path: '$results’,
preserveNullAndEmptyArrays: false
}}, {$match: {
'results.testref': 'TEST1'
}}, {$project: {
results: 1,
userref: 1,
}}, {$replaceRoot: {
newRoot: {
$mergeObjects: [
{
userref: '$userref'
},
'$results'
]
}
}}, {$project: {
userref: 1,
history: {
$slice: [
'$history',
-1
]
}
}}, {$match: {
'history.score': 15
}}, {$project: {
userref: 1,
}}]
谢谢
【问题讨论】:
-
你试过了吗?根据您的数据,
recent是什么意思? -
谢谢@Gibbs,我已经添加了更多细节和我已经开始的聚合。这对我来说似乎很笨重,所以我相信有更好的方法来做到这一点。 “最近的”是指历史数组中的最后一个条目。
标签: mongodb aggregation-framework