Eu tenho uma coleção do MongoDB com documentos no seguinte formato:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
Atualmente, posso obter documentos que correspondam a um tamanho de matriz específico:
db.accommodations.find({ name : { $size : 2 }})
Isso retorna corretamente os documentos com 2 elementos na name
matriz. No entanto, não posso executar um $gt
comando para retornar todos os documentos em que o name
campo tem um tamanho de matriz maior que 2:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
Como posso selecionar todos os documentos com uma name
matriz de tamanho maior que um (de preferência sem precisar modificar a estrutura de dados atual)?
mongodb
mongodb-query
emson
fonte
fonte
Respostas:
Atualizar:
Nas versões mongodb 2.2 ou superior, a maneira mais eficiente de fazer isso é descrita por @JohnnyHK em outra resposta .
1.Usando $ where
Mas...
2.Crie um campo extra
NamesArrayLength
, atualize-o com o comprimento da matriz de nomes e use em consultas:Será uma solução melhor e funcionará muito mais rápido (você pode criar um índice nele).
fonte
$where
, é muito flexível.Há uma maneira mais eficiente de fazer isso no MongoDB 2.2+ agora que você pode usar índices de array numéricos em chaves de objetos de consulta.
Você pode oferecer suporte a esta consulta com um índice que use uma expressão de filtro parcial (requer 3.2+):
fonte
{'Name Field.1': {$exists: true}}
.name
contém pelo menos um elemento, mas o OP estava procurando por maior que 1.Acredito que esta é a consulta mais rápida que responde à sua pergunta, porque não usa uma
$where
cláusula interpretada :Significa "todos os documentos, exceto aqueles sem nome (matriz inexistente ou vazia) ou com apenas um nome".
Teste:
fonte
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
, e também porque este é codificado para "1" e não escala a um arbitrária ou comprimento de matriz mínimo paramétrico.Você também pode usar agregado:
// você adiciona "size_of_name" ao documento de trânsito e o usa para filtrar o tamanho do nome
fonte
Tente fazer algo assim:
1 é número, se você deseja buscar um registro maior que 50, faça ArrayName.50 Obrigado.
fonte
Nenhuma das opções acima funcionou para mim. Este fez, então eu estou compartilhando:
fonte
Você pode usar $ expr (operador da versão 3.6 mongo) para usar funções de agregação em consultas regulares.
Compare
query operators
vsaggregation comparison operators
.fonte
$name
uma matriz que é um subdocumento, por exemplo, em um registro de "pessoa"passport.stamps
? Eu tentei várias combinações de citações, mas entendi"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
fonte
O MongoDB 3.6 inclui $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Você pode usar $ expr para avaliar uma expressão dentro de uma correspondência $ ou encontrar.
ou encontre
fonte
Encontrei esta solução, para encontrar itens com um campo de matriz maior que o comprimento certo
O primeiro agregado $ match usa um argumento verdadeiro para todos os documentos. Se em branco, eu ficaria
fonte
Eu sei que é uma pergunta antiga, mas estou tentando isso com $ gte e $ size em busca. Eu acho que encontrar () é mais rápido.
fonte
Embora as respostas acima funcionem, o que você originalmente tentou fazer era a maneira correta, mas você só tem a sintaxe para trás (alterne "$ size" e "$ gt") ..
Corrigir:
Incorreta:
fonte