Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

454
Vistas
Mangosta/MongoDB: $in y .sort()

Accedo a una API que sigue los datos de 50 miembros en un juego una vez al día y uso mongoose para convertir el JSON en documentos individuales en una colección. Entre días hay datos que son consistentes, por ejemplo, la etiqueta de cada miembro (una identificación para el miembro en el juego), pero hay datos que son diferentes (puntuaciones diferentes, etc.). Cada documento tiene una propiedad createdAt .

Me gustaría encontrar el documento más reciente para cada miembro y, por lo tanto, tener una matriz con la etiqueta de cada miembro.

Actualmente estoy usando la siguiente consulta para encontrar todos los documentos donde las etiquetas coinciden, sin embargo, están devolviendo todos los documentos, no solo uno. ¿Cómo clasifico/limito los documentos al más reciente, mientras lo mantengo como una consulta (o hay una "forma más mongodb")?

 memberTags = [1,2,3,4,5]; ClanMember.find({ 'tag': { $in: memberTags } }).lean().exec(function(err, members) { res.json(members); });

Gracias

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede consultar a través del marco de agregación. Su consulta implicaría una canalización que tiene etapas que procesan los documentos de entrada para brindarle el resultado deseado. En su caso, la tubería tendría una fase $match que actúa como una consulta para el filtro inicial. $match usa consultas estándar de MongoDB, por lo que aún puede consultar usando $in .

El siguiente paso sería ordenar esos documentos filtrados por el campo createdAt . Esto se hace usando el operador $sort .

La etapa de canalización anterior implica la agregación de los documentos ordenados para devolver el documento principal de cada grupo. El operador $group junto con el acumulador $first son los operadores que hacen esto posible.

Poniendo esto en conjunto, puede ejecutar la siguiente operación agregada para obtener el resultado deseado:

 memberTags = [1,2,3,4,5]; ClanMember.aggregate([ { "$match": { "tag": { "$in": memberTags } } }, { "$sort": { "tag": 1, "createdAt: -1 " } }, { "$group": { "_id": "$tag", "createdAt": { "$first": "$createdAt" } /*, include other necessary fields as appropriate using the $first operator eg "otherField1": { "$first": "$otherField1" }, "otherField2": { "$first": "$otherField2" }, ... */ } } ]).exec(function(err, members) { res.json(members); });

O modifique su consulta actual usando find() para que pueda ordenar en dos campos, es decir, los atributos de tag (ascendente) y createdAt (descendente). Luego puede seleccionar los 5 documentos principales usando el límite, algo como lo siguiente:

 memberTags = [1,2,3,4,5]; ClanMember.find( { 'tag': { $in: memberTags } }, // query {}, // projection { // options sort: { 'createdAt': -1, 'tag': 1 }, limit: memberTags.length, skip: 0 } ).lean().exec(function(err, members) { res.json(members); });

o

 memberTags = [1,2,3,4,5]; ClanMember.find({ 'tag': { $in: memberTags } }).sort('-createdAt tag') .limit(memberTags.length) .lean() .exec(function(err, members) { res.json(members); });
over 4 years ago · Santiago Trujillo Denunciar

0

Ok, entonces, primero, usemos findOne() para obtener solo un documento de la solicitud Luego, para ordenar por el documento más nuevo, puede usar .sort({elementYouWantToSort: -1}) (-1 significa que desea ordenar del más nuevo al más antiguo, y 1 del más antiguo al más nuevo) Recomendaría usar esta función en el _id, que ya incluye la fecha de creación del documento Lo que nos da la siguiente solicitud:

 ClanMember.findOne({ 'tag': { $in: memberTags } }).sort({_id: -1}).lean().exec(function(err, members) { res.json(members); });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda