Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

272
Visualizações
$filtrar dentro de $reducir o dentro de $mapa de matriz sin desenrollar

Necesito ayuda: quiero optimizar esta consulta para que sea más rápida, necesita filtrar por events.eventType:"log" all docs with server:"strong", pero sin etapas separadas de desenrollado y filtrado, tal vez de alguna manera dentro de $reduce etapa para agregar $ filtro.

ejemplo de documento único:

 { server: "strong", events: [ { eventType: "log", createdAt: "2022-01-23T10:26:11.214Z", visitorInfo: { visitorId: "JohnID" } }

consulta de agregación actual:

 db.collection.aggregate([ { $match: { server: "strong" } }, { $project: { total: { $reduce: { input: "$events", initialValue: { visitor: [], uniquevisitor: [] }, in: { visitor: { $concatArrays: [ "$$value.visitor", [ "$$this.visitorInfo.visitorId" ] ] }, uniquevisitor: { $cond: [ { $in: [ "$$this.visitorInfo.visitorId", "$$value.uniquevisitor" ] }, "$$value.uniquevisitor", { $concatArrays: [ "$$value.uniquevisitor", [ "$$this.visitorInfo.visitorId" ] ] } ] } } } } } } ])

resultado esperado, dos listas con un ID de visitante único y una lista de todos los ID de visitante:

 [ { "total": { "uniquevisitor": [ "JohnID" ], "visitor": [ "JohnID", "JohnID" ] }

} ]

patio de recreo

En la consulta de ejemplo, no se agrega ningún filtro para events.eventType:"log", ¿cómo se puede implementar esto sin $unwind?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No estoy seguro de que este enfoque esté más optimizado que el suyo, pero podría ser útil,

  • $filter para iterar el bucle de events y filtrar por eventType
  • $let declarar events variables y almacenar el resultado de los filtros anteriores
  • devuelve una matriz de visitor usando la notación de puntos $$events.visitorInfo.visitorId
  • devuelve una matriz de visitante único uniquevisitor mediante el uso de la notación de puntos $$events.visitorInfo.visitorId y el operador $setUnion
 db.collection.aggregate([ { $match: { server: "strong" } }, { $project: { total: { $let: { vars: { events: { $filter: { input: "$events", cond: { $eq: ["$$this.eventType", "log"] } } } }, in: { visitor: "$$events.visitorInfo.visitorId", uniquevisitor: { $setUnion: "$$events.visitorInfo.visitorId" } } } } } } ])

Patio de recreo


O un enfoque similar sin $let y dos etapas de $project ,

 db.collection.aggregate([ { $match: { server: "strong" } }, { $project: { events: { $filter: { input: "$events", cond: { $eq: ["$$this.eventType", "log"] } } } } }, { $project: { total: { visitor: "$events.visitorInfo.visitorId", uniquevisitor: { $setUnion: "$events.visitorInfo.visitorId" } } } } ])

Patio de recreo

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda