Tengo una colección con matrices anidadas como se muestra a continuación:
[ { "title":"Foo", "arr":[ [ { "value":"2021-11-13T00:00:00.000Z", "baz":10 }, { "value":"2021-11-12T00:00:00.000Z", "baz":0 } ] ] }, { "title":"Bar", "arr":[ [ { "value":"2021-12-03T00:00:00.000Z", "baz":10 }, { "value":"2021-12-07T00:00:00.000Z", "baz":0 } ] ] } ]Quiero filtrar el valor más grande (es decir, la última fecha) para cada documento de modo que el resultado sea:
[ { "title": "Foo", "value": "2021-11-13T00:00:00.000Z", }, { "title": "Bar", "value": "2021-12-07T00:00:00.000Z", }, ]¿Cómo se puede escribir esta consulta?
consulta1
aggregate( [{"$set": {"value": {"$max": {"$map": {"input": "$arr", "in": {"$max": "$$this.value"}}}}}}, {"$unset": ["_id", "arr"]}])consulta2
reduce y concatArrays para hacer que la matriz anidada sea una matriz no anidadamax para cada matriz aggregate( [{"$set": {"arr": {"$reduce": {"input": "$arr", "initialValue": [], "in": {"$concatArrays": ["$$value", "$$this"]}}}}}, {"$set": {"value": {"$max": "$arr.value"}}}, {"$project": {"_id": 0, "title": 1, "value": 1}}])En lugar de $reduce , también puede usar $filter y $map :
db.collection.aggregate([ { $set: { arr: { $map: { input: "$arr", as: "item", in: { $filter: { input: "$$item", cond: { $eq: ["$$this.baz", { $max: "$$item.baz" }] } } } } } } } ]) No está claro por qué tiene una matriz arr con solo un elemento. Si su colección siempre tiene un solo elemento elemento en arr , entonces también puede omitir el $map
db.collection.aggregate([ { $set: { arr: { $let: { vars: { item: { $first: "$arr" } }, in: { $filter: { input: "$$item", cond: { $eq: ["$$this.value", { $max: "$$item.value" }] } } } } } } } ])