J'ai une collection MongoDB avec des documents au format suivant:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
Je peux actuellement obtenir des documents qui correspondent à une taille de tableau spécifique:
db.accommodations.find({ name : { $size : 2 }})
Cela renvoie correctement les documents avec 2 éléments dans le name
tableau. Cependant, je ne peux pas exécuter de $gt
commande pour renvoyer tous les documents dont le name
champ a une taille de tableau supérieure à 2:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
Comment puis-je sélectionner tous les documents avec un name
tableau d'une taille supérieure à un (de préférence sans avoir à modifier la structure de données actuelle)?
mongodb
mongodb-query
emson
la source
la source
Réponses:
Mise à jour:
Pour les versions mongodb 2.2+, un moyen plus efficace de le faire décrit par @JohnnyHK dans une autre réponse .
1.Utilisation de $ where
Mais...
2.Créez un champ supplémentaire
NamesArrayLength
, mettez-le à jour avec la longueur du tableau de noms, puis utilisez-le dans les requêtes:Ce sera une meilleure solution et fonctionnera beaucoup plus rapidement (vous pouvez créer un index dessus).
la source
$where
, c'est très flexible.Il existe un moyen plus efficace de le faire dans MongoDB 2.2+ maintenant que vous pouvez utiliser des index de tableaux numériques dans les clés d'objets de requête.
Vous pouvez prendre en charge cette requête avec un index qui utilise une expression de filtre partielle (nécessite 3.2+):
la source
{'Name Field.1': {$exists: true}}
.name
contenant au moins 1 élément, mais l'OP recherchait plus de 1.Je pense que c'est la requête la plus rapide qui répond à votre question, car elle n'utilise pas de
$where
clause interprétée :Cela signifie «tous les documents sauf ceux sans nom (tableau inexistant ou vide) ou avec un seul nom».
Tester:
la source
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
, et aussi parce que cela est codé en dur pour "1" et ne s'adapte pas à une longueur minimale de tableau arbitraire ou paramétrique.Vous pouvez également utiliser l'agrégat:
// vous ajoutez "size_of_name" au document de transit et l'utilisez pour filtrer la taille du nom
la source
Essayez de faire quelque chose comme ceci:
1 est un nombre, si vous voulez récupérer un enregistrement supérieur à 50, faites ArrayName.50 Merci.
la source
Rien de ce qui précède n'a fonctionné pour moi. Celui-ci l'a fait alors je le partage:
la source
Vous pouvez utiliser $ expr (opérateur de version 3,6 mongo) pour utiliser les fonctions d'agrégation dans une requête régulière.
Comparez
query operators
vsaggregation comparison operators
.la source
$name
un tableau qui est un sous - document, par exemple dans un dossier « personne »,passport.stamps
? J'ai essayé différentes combinaisons de devis, mais j'obtiens"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
la source
MongoDB 3.6 inclut $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Vous pouvez utiliser $ expr pour évaluer une expression dans une correspondance $, ou find.
ou trouver
la source
J'ai trouvé cette solution, pour trouver des éléments avec un champ de tableau supérieur à une certaine longueur
Le premier agrégat $ match utilise un argument qui est vrai pour tous les documents. Si vide, j'obtiendrais
la source
Je connais sa vieille question, mais j'essaye ceci avec $ gte et $ size dans find. Je pense que trouver () est plus rapide.
la source
Bien que les réponses ci-dessus fonctionnent toutes, ce que vous avez essayé de faire à l'origine était la bonne façon, mais vous avez juste la syntaxe à l'envers (changez "$ size" et "$ gt") ..
Correct:
Incorrect:
la source