Mongodb 如何根据mongo文档数组中的最大日期获取记录
下面是一个文档,它有一个数组名Mongodb 如何根据mongo文档数组中的最大日期获取记录,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,下面是一个文档,它有一个数组名datum,我想根据group by year和type以及max date过滤记录 { "_id" : ObjectId("5fce46ca6ac9808276dfeb8c"), "year" : 2018, "datum" : [ { "Type" : "1",
datum
,我想根据group by year和type以及max date过滤记录
{
"_id" : ObjectId("5fce46ca6ac9808276dfeb8c"),
"year" : 2018,
"datum" : [
{
"Type" : "1",
"Amount" : NumberDecimal("100"),
"Date" : ISODate("2018-05-30T00:46:12.784Z")
},
{
"Type" : "1",
"Amount" : NumberDecimal("300"),
"Date" : ISODate("2023-05-30T00:46:12.784Z")
},
{
"Type" : "2",
"Amount" : NumberDecimal("340"),
"Date" : ISODate("2025-05-30T00:46:12.784Z")
},
{
"Type" : "3",
"Amount" : NumberDecimal("300"),
"Date" : ISODate("2021-05-30T00:46:12.784Z")
}
]
}
我尝试的聚合查询
[{$group: {
_id :"$year",
RecentValue :
{
$sum: {
$reduce: {
input: '$datum',
initialValue: {},
'in': {
$cond:
[
{
$and:
[
{$or:[
{ $eq: [ "$$this.Type", '2' ] },
{$eq: [ "$$this.Type", '3' ] }
]},
{ $gt: [ "$$this.Date", "$$value.Date" ] },
]
}
,
"$$this.Amount",
0
]
}
}
}
}
}}]
最大日期为“2025-05-30T00:46:12.784Z”的预期输出
请让我知道我在聚合查询中犯了什么错误。您可以在
$group
阶段之前获取最大日期
获取具有最大日期起始的文档,在条件下用$替换或,并更正返回值$addFields
按$组
和金额年度
如何排除除$addField阶段中的金额之外的其他字段,以及您能否指出我在查询中犯了什么错误。由于您的条件和$reduce的组合,您不能以这种方式排除其他字段,它被排除在$group阶段,您的错误在
{$gt:[“$$this.Date”,“$$value.Date”]}
=>$$this.value
这是未定义的,因为您可以看到$cond
的then和您返回的金额或0的其他部分,因此$$value
将是金额或0。因此,我在then and else部分中所做的是,我返回了完整对象$$this或$$valueAdd fields阶段是否会导致任何与性能相关的问题,并且它将再次运行至少100万条记录。我认为不,addFields只需筛选数组并仅获取所需对象,即可在下一个$group阶段进行处理。我不确定它是否会运行超过100万个文档,这取决于第一阶段的模式设计、索引和集合扫描、数组中的元素数量、服务器空间和集群计划等。对于查询优化,您可以参考
{
_id :2018,
RecentValue : 340
}
db.collection.aggregate([
{
$addFields: {
datum: {
$reduce: {
input: "$datum",
initialValue: {},
"in": {
$cond: [
{
$and: [
{ $in: ["$$this.Type", ["2", "3"]] },
{ $gt: ["$$this.Date", "$$value.Date"] }
]
},
"$$this",
"$$value"
]
}
}
}
}
},
{
$group: {
_id: "$year",
RecentValue: { $sum: "$datum.Amount" }
}
}
])