How to insert a Dictionary as an array in the Mongo using c#

Asked

Viewed 104 times

-1

I’m mounting a monitoring system, I have a process class that gets a string NomeDoProcesso, and a Dictionary<string,Float>Variavel, in which the user enters the variable name in a textBox, and a function calculates Float.

Process is an array within a Mongo document and Variable is an array within Process. Following some examples of code I’m doing as in the code below, but not saving in the bank.

///Classe que contém meus objetos
public class Processo
    {
        public string NomeProcesso;
        public Dictionary<string, float> Variaveis;
        public int QtdProcessadores;


        public Processo()
        {
            Variaveis = new Dictionary<string, float>();
        }

        public void Monitorar()
        {
            if (Variaveis != null && Variaveis.Count > 0)
            {
                QtdProcessadores = Environment.ProcessorCount;
                foreach (string variavel in Variaveis.Keys)
                {
                    PerformanceCounter pc = new PerformanceCounter("Process", variavel, NomeProcesso, true);
                    pc.NextValue(); // Sempre primeiro valor é zero.
                    Thread.Sleep(100);
                    Variaveis[variavel] = pc.NextValue();
                }
            }
///Função para inserir dinamicamente as variáveis, preciso inserir o dictionary como array
/// os outros valores estão já estão sendo inseridos
 public void InserirCfgMonitoramento(string nomeBD, string colecaoCfg, CfgMonitoramento cfgMonitoramento)
        {
            // Recupera coleção.
            MongoCollection<BsonDocument> colecao = RecColecao1(nomeBD,colecaoCfg);
            if (colecao != null)
            {
                // Seleciona configuração.
                IMongoQuery selecao = Query.EQ("Estacao", cfgMonitoramento.Estacao);
                MongoCursor cursor = colecao.FindAs(typeof(BsonDocument), selecao);
                // Define nome da estação.
                BsonDocument doc = new BsonDocument("Estacao", cfgMonitoramento.Estacao);

                // Dados processo
                if (cfgMonitoramento.Processos != null && cfgMonitoramento.Processos.Count > 0 )
                {
                    List<General.Message.AgentQTS.Processo> processo = new List<General.Message.AgentQTS.Processo>();
                    List<BsonDocument> processosBD = new List<BsonDocument>();
                    BsonDocument docProcessos;
                    foreach (General.Message.AgentQTS.Processo proc in processo)
                    {
                        docProcessos = new BsonDocument("NomeProcesso", proc.NomeProcesso);


                        BsonArray variaveis = new BsonArray();
                        if (variaveis != null && variaveis.Count > 0)
                        {
                            foreach (KeyValuePair<string, float> variavel in proc.Variaveis)
                                variaveis.Add(Convert.ToString(variavel.Key));
                        }

                        docProcessos.Add("Variaveis",new BsonArray(variaveis));
                        docProcessos.Add("TmoMonProcesso", cfgMonitoramento.TmoMonProcessos);
                        docProcessos.Add("UltimoMonProcessos", DateTime.Now);
                        processosBD.Add(docProcessos);
                    }
                    doc.Add("Processo", new BsonArray(processosBD));
                }
                doc.Add("Habilitado", cfgMonitoramento.Habilitado);
                colecao.Insert(doc);
            }
            else
                throw new Exception(String.Format("Coleção {0} não encontrada!", colecaoCfg));


        }
  • Hello, you had the opportunity to check the answer? What should I do if someone answers my question?

  • Hi, thanks for the help, I’m using. net 3.5 so I had to create Bsondocument manually, I couldn’t do otherwise.But I was able to solve my problem

  • Then add this information to the question and write an answer to indicate how it was resolved and mark the answer itself as accepted. So other people with the same problem can find the solution.

1 answer

0

When using the C# Mongodb driver it is not necessary to create the Bsondocument manually. In this case, it would be possible to do it directly

colecao.InsertOneAsync(processo);

For the dictionary to be inserted correctly, it may be necessary to decorate the property with [BsonExtraElements].

public class Processo
{
    public string NomeProcesso;

    [BsonExtraElements]
    public Dictionary<string, float> Variaveis;

    public int QtdProcessadores;

(...)

Browser other questions tagged

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