Não acredito que isso tenha mudado. Ao marcar $ ne, o valor é verificado em todos os documentos, incluindo aqueles que não contêm o campo, mas $ ne: null ainda não corresponderá a um documento que não contém o campo, pois o valor do campo ainda é nulo, mesmo que o campo não exista nesse documento.
Tim Gautier
2
Como você apenas combina com o segundo documento?
21416 BT
1
@ River Verifiquei quando escrevi isso há 3 anos e, só para ter certeza, instalei o Mongo e tentei novamente. Ainda funciona da mesma maneira, a resposta está correta. A 2ª à última consulta retorna apenas o 1º documento.
Tim Gautier #
1
Os exemplos apresentados tornam realmente compreensível como usar isso. :-)
$ existe : quando verdadeiro, $ existe corresponde aos documentos que contêm o campo, incluindo documentos em que o valor do campo é nulo. Se for falso, a consulta retornará apenas os documentos que não contêm o campo.
$ ne seleciona os documentos em que o valor do campo não é igual ao valor especificado. Isso inclui documentos que não contêm o campo.
Portanto, no seu caso fornecido, a consulta a seguir retornará todos os documentos com o campo imageurl e não terá valor nulo:
Você pode verificar o tipo de atributo requerido, ele retornará todos os documentos que seu nome_campo consultado contém um valor, porque você está verificando o tipo de arquivo arquivado, caso seja nulo, a condição de tipo não corresponde, portanto nada será retornado.
Nota : se o field_name tiver uma cadeia vazia que significa "", será retornada. É o mesmo comportamento para
Este documento Json é válido? Duas propriedades com o mesmo nome no documento de consulta. Não tenho certeza de como você criaria isso na memória, se fosse necessário.
BrentR
4
Em um caso ideal, você gostaria de teste para todos os três valores , nula , "" ou esvaziar (campo não existe no registro)
Uma alternativa que não foi mencionada, mas que pode ser uma opção mais eficiente para alguns (não funcionará com entradas NULL), é usar um índice esparso (as entradas no índice existem apenas quando há algo no campo). Aqui está um conjunto de dados de amostra:
Agora, sempre há uma chance (e em particular com um pequeno conjunto de dados como o meu exemplo) de que, em vez de usar um índice, o MongoDB use uma varredura de tabela, mesmo para uma possível consulta de índice coberta. Acontece que isso me dá uma maneira fácil de ilustrar a diferença aqui:
E existe o resultado que estávamos procurando - apenas documentos com o campo preenchido são retornados. Isso também usa apenas o índice (ou seja, é uma consulta de índice coberta), portanto, apenas o índice precisa estar na memória para retornar os resultados.
Este é um caso de uso especializado e não pode ser usado em geral (consulte outras respostas para essas opções). Em particular, deve-se notar que, como estão as coisas, você não pode usar count()dessa maneira (no meu exemplo, retornará 6 e não 4); portanto, use somente quando apropriado.
O problema disso é que ele supõe que o campo nunca foi realmente persistido, mas o OP parece indicar (a partir do título) que ele poderia existir, mas deve ser definido como nulo explicitamente.
{ field : {$ne : null} }
de seleção para não-nula docs.mongodb.org/manual/reference/operator/query/neRespostas:
Isso retornará todos os documentos com uma chave chamada "IMAGE URL", mas eles ainda podem ter um valor nulo.
Isso retornará todos os documentos com uma chave chamada "URL de IMAGEM" e um valor não nulo.
Além disso, de acordo com os documentos, $ existe atualmente não pode usar um índice, mas $ ne pode.
Edit: Adicionando alguns exemplos devido ao interesse nesta resposta
Dadas estas inserções:
Isso retornará todos os três documentos:
Isso retornará apenas o primeiro e o segundo documentos:
Isso retornará apenas o primeiro documento:
Isso retornará apenas o segundo e o terceiro documentos:
fonte
$ne
inclui documentos que não contêm o campo . Isso mudou desde que você postou a resposta? docs.mongodb.org/manual/reference/operator/query/neUm forro é o melhor:
Aqui,
mycollection : coloque o nome da coleção desejada
nome do campo : coloque seu nome campo desejado
Explicação:
$ existe : quando verdadeiro, $ existe corresponde aos documentos que contêm o campo, incluindo documentos em que o valor do campo é nulo. Se for falso, a consulta retornará apenas os documentos que não contêm o campo.
$ ne seleciona os documentos em que o valor do campo não é igual ao valor especificado. Isso inclui documentos que não contêm o campo.
Portanto, no seu caso fornecido, a consulta a seguir retornará todos os documentos com o campo imageurl e não terá valor nulo:
fonte
$exists: true
é redundante,$ne: null
é suficiente.$exists: true
retornanull
valores também. Tem que haver ambos$exists: true
e$ne: null
. NÃO é redundante.No pymongo você pode usar:
Porque pymongo representa mongo "null" como python "None".
fonte
buscar documentos que contenham esse nome_do_arquivo mesmo que seja nulo.
Minha proposição:
Você pode verificar o tipo de atributo requerido, ele retornará todos os documentos que seu nome_campo consultado contém um valor, porque você está verificando o tipo de arquivo arquivado, caso seja nulo, a condição de tipo não corresponde, portanto nada será retornado.
Nota : se o field_name tiver uma cadeia vazia que significa "", será retornada. É o mesmo comportamento para
Validação extra:
Ok, então ainda não terminamos, precisamos de uma condição extra.
OU
Referência
fonte
Esta consulta funcionou para nós (consulta executada a partir do MongoDB compass ):
fonte
fonte
Em um caso ideal, você gostaria de teste para todos os três valores , nula , "" ou esvaziar (campo não existe no registro)
Você pode fazer o seguinte.
fonte
Uma alternativa que não foi mencionada, mas que pode ser uma opção mais eficiente para alguns (não funcionará com entradas NULL), é usar um índice esparso (as entradas no índice existem apenas quando há algo no campo). Aqui está um conjunto de dados de amostra:
Agora, crie o índice esparso no campo imageUrl:
Agora, sempre há uma chance (e em particular com um pequeno conjunto de dados como o meu exemplo) de que, em vez de usar um índice, o MongoDB use uma varredura de tabela, mesmo para uma possível consulta de índice coberta. Acontece que isso me dá uma maneira fácil de ilustrar a diferença aqui:
OK, os documentos extras sem
imageUrl
estão sendo devolvidos, apenas vazios, não o que queríamos. Apenas para confirmar o porquê, faça uma explicação:Então, sim, a
BasicCursor
é igual a uma varredura de tabela, não usou o índice. Vamos forçar a consulta a usar nosso índice esparso com umhint()
:E existe o resultado que estávamos procurando - apenas documentos com o campo preenchido são retornados. Isso também usa apenas o índice (ou seja, é uma consulta de índice coberta), portanto, apenas o índice precisa estar na memória para retornar os resultados.
Este é um caso de uso especializado e não pode ser usado em geral (consulte outras respostas para essas opções). Em particular, deve-se notar que, como estão as coisas, você não pode usar
count()
dessa maneira (no meu exemplo, retornará 6 e não 4); portanto, use somente quando apropriado.fonte
A maneira mais simples de verificar a existência da coluna no mongo compass é:
fonte
a consulta será
retornará todos os documentos com "URL de IMAGEM" como chave ...........
fonte
$exists
verifica a chave"IMAGE URL"
e não considera de valor (null
) e irá retornar um documento com"IMAGE URL" : null
.