我有以下文档,每个文档都包含
values
和dates
两个数组字段。这些数组在每个文档中的大小始终相同,也就是说dates
中的每个值对应于values
中的一个值:[
{
_id: "Stock1",
values: [
1,
2,
3
],
dates: [
ISODate("2000-01-01"),
ISODate("2010-01-01"),
ISODate("2020-01-01")
]
},
{
_id: "Stock2",
values: [
4,
5,
],
dates: [
ISODate("2000-01-01"),
ISODate("2010-01-01")
]
},
{
_id: "Stock3",
values: [
7,
8,
9
],
dates: [
ISODate("2000-01-01"),
ISODate("2010-01-01"),
ISODate("2020-01-01")
]
}
]
我想查询我的文档,以便获取在日期“2010-01-01”和日期“2020-01-01”之间(包括这两个日期)的“Stock1”和“Stock3”的值
,即最终结果应为:
[
{
_id: "Stock1",
values: [
2,
3
],
dates: [
ISODate("2010-01-01"),
ISODate("2020-01-01")
]
},
{
_id: "Stock3",
values: [
8,
9
],
dates: [
ISODate("2010-01-01"),
ISODate("2020-01-01")
]
}
]
目前,我正在执行以下操作:
db.collection.aggregate([
{
$match: {
_id: {
$in: [
"Stock1",
"Stock3"
]
}
}
},
{
$unwind: {
path: "$dates",
includeArrayIndex: "date_index"
}
},
{
$match: {
dates: {
$gte: ISODate("2010-01-01"),
$lte: ISODate("2020-01-01")
}
}
},
{
$unwind: {
path: "$values",
includeArrayIndex: "value_index"
}
},
{
$match: {
$expr: {
$eq: [
"$date_index",
"$value_index"
]
}
}
},
{
$project: {
date_index: 0,
value_index: 0
}
}
])
但我还没有完全达到那个水平。此外,管道看起来又长又次优。有更好的方法吗?最后,我首先在dates
上使用unwind
,然后进行过滤,再在values
上再次使用unwind
:这是为了避免管道中的文档数量过多,因为数组dates
和values
可能非常大。
任何帮助都将不胜感激!