digamos que eu tenha 7 documentos como este:
// with content.id
{
"_id" : 1, // I know it will be ObjectId but for simplicity here I'll set it as int
"content" : {"id" : 1, "title" : "some title"}
}
// without content.id
{
"_id" : 2,
"content" : {"title" : "some title"}
}
// with content.id equal to null
{
"_id" : 3,
"content" : {"id" : null, "title" : "some title"}
}
// with empty content object
{
"_id" : 4,
"content" : {}
}
// with content as an empty array
{
"_id" : 5,
"content" : []
}
// with content equal to null
{
"_id" : 6,
"content" : null
}
// without content
{
"_id" : 7,
}
e preciso pegar todos os registros onde não temos content.id
no nosso caso todos os registros exceto o registro 1.
Eu tentei com
collection.find({"content.id" : null});
e não retorna o registro 1 que está correto mas também não retorna o registro com id 5, onde content
está definido como um array vazio
também, tentei com
collection.find({"content.id" : {"$exists" : false}});
nesse caso, ele retorna o registro com id 5, mas não retorna o registro com id 3, onde content.id
existe mas está definido como nulo.
Descobri que a consulta pode funcionar com uma combinação de ambos, assim
collection.find({ "$or" : [{"content.id" : {"$exists" : false}} , {"content.id" : null}]});
mas essa consulta funciona um pouco mais devagar :(
Existe maneira melhor de cobrir todos os casos descritos acima?
Você pode perguntar por que quero cobrir ambos content: {}
e content: []
? porque o PHP às vezes converte um array vazio em um objeto, mas às vezes em um array vazio, para não ter problemas, quero cobrir os dois casos.
Você pode cobrir todos os casos com
$ifNull
except[]
. Portanto, basta usar[]
como substituto$ifNull
para cobrir o caso 5.Parque Mongo