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

207
Vistas
Ordenar según la función aplicada a cada elemento en el elemento de matriz en MongoDB

Tengo un objeto que contiene un campo con una lista de medidas para uno de los campos:

 public class TestObject { [BsonElement("graph")] public List<Measurement> Graph { get; set; } } public class Measurement { [BsonRequired] [BsonElement("magnitude")] public uint Magnitude { get; set; } [BsonRequired] [BsonElement("measured_on")] public DateTime MeasuredOn { get; set; } }

Estoy tratando de escribir una operación de búsqueda para MongoDB que recupere las primeras N entradas de TestObject ordenadas por la suma de los M atributos de Magnitude más recientes en el atributo Graph . Mi intento actual se ve así:

 var findOptions = new FindOptions<TestObject> { Limit = N, Sort = new SortDefinitionBuilder<TestObject>() .Descending(p => p.Graph.OrderByDescending(r => r.MeasuredOn) .Take(M) .Sum(r => r.Magnitude)), Projection = new ProjectionDefinitionBuilder<TestObject>() .Slice(p => p.Graph, 0, N), }; IMongoCollection<TestObject> collection = GetCollection(); var cursor = await collection.FindAsync(FilterDefinition<TestObject>.Empty, findOptions, token) .ConfigureAwait(false); return await cursor.ToListAsync(token).ConfigureAwait(false);

Sin embargo, esto actualmente arroja una NotSupportedException :

 System.NotSupportedException: The method OrderByDescending is not supported in the expression tree: {document}{graph}.OrderByDescending(r => r.MeasuredOn).

A partir de esto, puedo entender que mi intento de mezclar expresiones LINQ con MongoDB no funcionará, pero no puedo entender cómo hacer que esta consulta funcione. Cualquier ayuda sería apreciada.

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

0

no creo que sea posible lograrlo con la interfaz de Find . sin embargo, la interfaz de Aggregation puede hacerlo así:

 let docLimit = 1; let graphLimit = 2; db.collection.aggregate( [ { $project: { _id: 1, graph: 1 } }, { $unwind: "$graph" }, { $sort: { "graph.measured_on": -1 } }, { $group: { _id: "$_id", graph: { $push: "$graph" }, } }, { $set: { graph: { $slice: ["$graph", graphLimit] } } }, { $set: { graphSum: { $sum: "$graph.magnitude" } } }, { $sort: { graphSum: -1 } }, { $limit: docLimit }, { $unset: "graphSum" } ])

Tampoco crea que puede traducir la consulta de agregación anterior a una consulta c# fuertemente tipada. solo tendrá que pasar una cadena json al controlador.

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