node.js - MongoDB 过滤 $lookup 具有日期范围的文档
问题描述
我有一个查询,输出如下。
return ChallengeModel.aggregate([
{ $match: { is_processed: false,} },
{ $lookup: {
from: 'scoreboards',
let: { 'challengeId': '$_id' },
pipeline: [{ $match: { $expr: { $eq: [ '$challenge_id', '$$challengeId' ]}} }],
as: 'scoreboards'
} }
]);
输出:
{
"_id": "5b9679db0a3d61258aa3ffc3",
"voucher_paid_by": "issuer",
"start_date": "2018-09-03T00:00:00.000Z",
"end_date": "2018-09-09T23:59:00.000Z",
"accept_by_date": "2018-09-03T12:00:00.000Z",
"scoreboards": [
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-01T00:00:00.000Z",
"value": 2
},
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-02T00:00:00.000Z",
"value": 6
},
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-03T00:00:00.000Z",
"value": 5
},
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-04T00:00:00.000Z",
"value": 9
},
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-05T00:00:00.000Z",
"value": 7
},
{
"_id": "5b9757c68a6f1615d8e704d3",
"user_id": "5b9667200a3d61258aa3ff9f",
"date": "2018-09-06T00:00:00.000Z",
"value": 1
}
]
}
我从输出中去掉了challenge_id,所以输出只是一个例子。
现在我想执行相同的查询,我只想要在 start_date 和 end_date 范围内的记分牌数据。
所以我做了这样的事情。
return ChallengeModel.aggregate([
{ $match: { is_processed: false,} },
{ $lookup: {
from: 'scoreboards',
let: { 'challengeId': '$_id', 'startDate': '$start_date', 'endDate': '$end_date' },
pipeline: [{ $match: {
date: { $gte: '$$startDate', $lt: '$$endDate' },
$expr: { $eq: [ '$challenge_id', '$$challengeId' ]}}
}],
as: 'scoreboards'
} }
]);
但它返回记分牌的空数组。我做对了吗?
解决方案
您需要$expr
与其他字段以及$match
文档的相同字段一起使用。
ChallengeModel.aggregate([
{ "$match": { "is_processed": false,} },
{ "$lookup": {
"from": "scoreboards",
"let": { "challengeId": "$_id", "startDate": "$start_date", "endDate": "$end_date" },
"pipeline": [
{ "$match": {
"$expr": {
"$and": [
{ "$eq": [ "$challenge_id", "$$challengeId" ] },
{ "$gte": [ "$date", "$$startDate" ] },
{ "$lt": [ "$date", "$$endDate" ] }
]
}
}}
],
"as": "scoreboards"
}}
])
推荐阅读
- reactjs - Firebase IdToken 过期后如何刷新?
- postgresql - 有没有办法让唯一索引忽略旧数据?
- sql - Oracle截断父表约束错误
- knuth-morris-pratt - 使用 Knuth Morris 计算每个前缀的出现次数
- opencv - catkin 包库链接到 openCV 库
- css - 从 Blade File 下载 PDF 不显示字母 Ć、Č、Ž
- javascript - 将 EditorJs 文本编辑器 json 转换为 html 元素的最佳方法是什么?
- c++ - 未分配被释放的指针(在将堆栈实现为链表时)
- azure-devops - Azure 构建管道突然开始失败(不支持以下服务的当前版本:GitOdb)
- python - 基于多索引对列值求和