Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Trabalhando com datas nulas

Boa noite pessoal!

Estou com uma dúvida, espero que alguém possa me ajudar.

Exemplo em SQL Server:

SELECT Codigo, DataEmissao, Vencimento, DataCompensacao, OutrosCampos
FROM Documentos
WHERE CASE WHEN DataCompensacao IS NULL THEN Vencimento ELSE DataCompensacao END >= :DataI
AND CASE WHEN DataCompensacao IS NULL THEN Vencimento ELSE DataCompensacao END <= :DataF
ORDER BY CASE WHEN DataCompensacao IS NULL THEN Vencimento ELSE DataCompensacao END

ou seja, trabalho com prioridade nas datas, como nem sempre todo documento já esta compensado, trabalho com o vencimento como previsão, até que o documento seja compensado, a partir do momento da compensação passo a utilizar essa data na consulta, tanto para o filtro como para a ordenação.

Agora a dúvida, é possível uma consulta no mongodb com esse mesmo tratamento?

Dei uma pesquisada e encontrei o:

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } }

mas não consegui aplicar. Se alguém puder me ajudar, agradeço.

Obrigado! Att. Marcelo

2 respostas
solução!

Oi Marcelo,

Geralmente não colocamos campos nulos, mas caso seja necessário você pode usar uma string vazia no lugar do valor.

O $condé uma condição de agregação para usa - lo basta usar o método aggregate junto com $project e o $cond como abaixo:

db.inventory.aggregate(
   [
      {
         $project:
           {
             item: 1,
             discount:
               {
                 $cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }
               }
           }
      }
   ]
)

se o campo da collection precisar ser selecionado use 1como valor, caso não queira selecionar o campo use 0.

Espero ter ajudado.

Abraços

Boa tarde Felipe.

Sofri um pouco mas rolou, vou postar aqui pra compartilhar com o pessoal a forma que consegui resolver.

Sua ajuda foi muito útil, valeu abraço!

db.nomebd.aggregate(
    [
        { $match: { primeirosFiltros: "filtros" } },
        { $project: 
            { 
                campo1: 1, campo2: 1, campo3: 1, campo4: 1, campo5: 1, campo6: 1, campoN: 1, 

                datafiltro: 
                {       
                    $cond: { if: { $eq: [ "$datacompensacao", "" ] }, then: "$vencimento", else: "$datacompensacao" } 
                } 
            } 
        }, 
        { $match: { $and: [ { datafiltro: { $gte: "DataI", $lte: "DataF" } }, { outrosFiltros: "filtros" } ] } }, 
        { $sort : { datafiltro : 1 } } 
    ] 
).pretty()

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software