Retrieving item from mongoDB array using C#

Asked

Viewed 122 times

0

Good morning, I’m having trouble retrieving an array item within a Mongo document using C#. Below is an example of a document:

{"_id":"5e1374ae38fa7026b88d4dc8",
"Estacao":"NomeDaEstacao",
"Diretorio":[{"Caminho":"c:",
"TmoMonDiretorio":50,
"UltimoMonDiretorio":"2020-01-06T17:55:58.370Z"}],
"Habilitado":true}

Path is a Directory object; Station, Tmomondiretorio, Ultimomondirectory and Enabled are Settings objects. Still within Configuration there is a List Directory. I’m getting Recover station and enabled with the method below and save in their respective variables, but Tmomondiretorio, Ultimomondiretorio not finding, follows the code.

private Diretorio RecDiretorio(BsonDocument doc)
{
 if(doc !=null)
   {
     Diretorio diret = new Diretorio(doc.GetValue("Caminho").AsString;
     return diret
   }
   return null;
}

 private Configuracao RecCfgMonitoramento(BsonDocument doc)
        {

            if (doc != null)
            {

                List<Diretorio> dir = new List<Diretorio>();
                if (doc.Contains("Diretorio"))
                {
                    BsonArray diretorioBD = doc.GetValue("Diretorio").AsBsonArray;
                    foreach (BsonValue diretorio in diretorioBD)
                        dir.Add(RecCfgDiretorio(diretorio.AsBsonDocument));
                }
 Configuracao cfgMonitoramento = new Configuracao(
                    doc.GetValue("Estacao").AsString,
                    dir,                    
                    (float)doc.GetValue("TmoMonDiretorio").AsInt32,
                    doc.Contains("UltimoDiretorio") ?    doc.GetValue("UltimoMonDiretorio").ToLocalTime() : DateTime.MinValue,                                       
                    doc.GetValue("Habilitado").AsBoolean);
                // Cria filtro.
                return cfgMonitoramento;                
            }
            return null;
        }

Class Configuration

public class Configuracao{      

        public string Estacao { get; set; }

        public List<Diretorio> Diretorios { get; set; }

        public float TmoMonDiretorios { get; set; } // (segundos)

        public DateTime UltimoMonDiretorios { get; set; }

        public bool Habilitado { get; set; }

 public Configuracao() : this("", new List<Diretorio>(), 0.0F, true) { }

public Configuracao(string estacao, 
            List<Diretorio> diretorio, 
            float tmoMonDiretorios, 
            DateTime ultimoMonDiretorios,            
            bool habilitado)
        {
            Estacao = estacao;
            Diretorios = diretorio;            
            TmoMonDiretorios = tmoMonDiretorios;
            UltimoMonDiretorios = ultimoMonDiretorios;            
            Habilitado = habilitado;
        }
}

In conclusion, I need to recover the data of Tmomondiretorio and Ultimomondiretorio, when debugging the code, path and enabled this working, would have how to help me?

Edit:

public class Diretorio
    {

        public string Caminho{ get; set; }
        public long EspacoTotal{ get; set; }
        public long EspacoDisponivel{ get; set; }
        public double PercentualDisponivel
        {
            get { return 100.0 * EspacoDisponivel / EspacoTotal; }
        }
        // ---------------------------------------------------------------------------------------
        // -- Construtores
        // ---------------------------------------------------------------------------------------
        /// <summary>
        /// Construtor padrão.
        /// </summary>
        public Diretorio() : this("") { }

        public Diretorio(string caminho, long espacoTotal, long espacoDisponivel) 
        {
            Caminho = caminho;
            EspacoTotal = espacoTotal;
            EspacoDisponivel = espacoDisponivel;
        }
}
  • Could include the code of Diretorio?

1 answer

0


There is a difference between the Mongo object and its class. In Mongo, the properties TmoMonDiretorio and UltimoMonDiretorio are in Diretorio (although it has the singular name, it is a list). To fix the problem it is necessary to check if the properties belong to the class Diretorio or Configuracao.

  • If they belong to Configuracao, it is necessary to correct the data in Mongo.
  • If they belong to Diretorio, it is necessary to change the class, passing the properties to Diretorio and fill in the values in the method RecDiretorio, instead of using the Configuracao.

It is also worth noting that it is not necessary to have all this code. Mongo’s own driver for C# does the deserialization of the object.

Ex:

var colecao = database.GetCollection<Entidade>("entidades");
var filtro = Query<Entidade>.EQ(e => e.Id, id);
var entidade = collection.FindOne(filtro);

Where Entidade would be your class and entidades the collection in Mongo. In the example above, the search for Entidade for his id.

  • Thanks for the feedback, my solution was really to take the data Tmomondiretorio and Ultimomondiretorio from inside the Directory list and leave them only as Configuration objects.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.