es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

IQueryable en mongoDB no soporta {documento} en $project o $group.

Estoy teniendo este problema después de ejecutar Select en IQueryable

‘$project’ or ‘$group’ no admite {documento}.

public Interface IVideo
{
   ....
   public string File { get; set;} 
   public bool Categorized { get; set;}
   public IMovie Movie { get; set;} 
   ....
}

public Interface IMovie
{
   ....
   public List<string> Langauge {get; set;} 
   ....
}

public static Dictionary<string, int=""> GetLanguage(string isp)
{
    // Repository.GetVideos() es IQueryable<ivideo>
    var videos = Repository.GetVideos().Where(q => q.Categorized && (
                                                       q.File == isp ||
                                                       q.File == "st"));

    var language = videos.SelectMany(q => q.Movie.Language).Select(e => e);
    var ql = from x in language
             group x by x
             into g
             let count = g.Count()
             orderby count descending
             select new { g.Key, count }; // el problema está aquí

    return ql.ToDictionary(item => item.Key, item => item.count);
}

¿Cómo puedo solucionar este problema?</string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema puede ser causado al intentar agrupar por un campo anidado en el conjunto de resultados IQueryable. Para solucionar esto, intenta utilizar una agregación de canalización en lugar de utilizar directamente IQueryable.

    Modifica el método GetLanguage de la siguiente manera:

    public static Dictionary<string, int=""> GetLanguage(string isp)
    {
        var pipeline = new []
        {
            new BsonDocument("$match", new BsonDocument
            {
                {"Categorized", true},
                {
                    "$or", new BsonArray
                    {
                        new BsonDocument("File", isp),
                        new BsonDocument("File", "st")
                    }
                }
            }),
            new BsonDocument("$unwind", "$Movie"),
            new BsonDocument("$unwind", "$Movie.Language"),
            new BsonDocument("$group", new BsonDocument
            {
                {"_id", "$Movie.Language"},
                {"count", new BsonDocument("$sum", 1)}
            }),
            new BsonDocument("$sort", new BsonDocument("count", -1)),
            new BsonDocument("$project", new BsonDocument
            {
                {"_id", 0},
                {"language", "$_id"},
                {"count", "$count"}
            })
        };
    
        var ql = Repository.GetVideos().Aggregate<bsondocument>(pipeline)
                    .ToList()
                    .Select(doc => new { language = doc["language"].AsString, count = doc["count"].AsInt32 })
                    .ToDictionary(item => item.language, item => item.count);
    
        return ql;
    }
    

    Este código utiliza el controlador de MongoDB C# para realizar la agregación en el lado del servidor, desenrollando el campo Movie.Language y agrupándolo antes de devolver el conjunto de resultados. Ten en cuenta que el conjunto de resultados se convierte en un Dictionary para facilitar su consumo.</string,>

Comments are closed.