866 votes

Recherche de documents dont la taille du tableau est supérieure à 1

Je dispose d'une collection MongoDB contenant 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 fichier name réseau. Cependant, je ne peux pas faire un $gt pour retourner tous les documents dans lesquels le name 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 d'une taille supérieure à un (de préférence sans avoir à modifier la structure de données actuelle) ?

3 votes

Les versions plus récentes de MongoDB disposent de l'opérateur $size ; vous devriez consulter la réponse de @tobia.

8 votes

La solution actuelle : FooArray:{$gt:{$size : 'length'}} --> la longueur peut être un nombre quelconque

1 votes

@SergiNadal : Je ne pense pas que cela FooArray:{$gt:{$size:'length'}} fonctionne ! Au moins sur l'objet imbriqué qui est un tableau. person:{ids:[123,456]}

56voto

Aman Goel Points 1457

Essayez de faire quelque chose comme ça :

db.getCollection('collectionName').find({'ArrayName.1': {$exists: true}})

1 est un nombre, si vous voulez récupérer un enregistrement supérieur à 50, faites ArrayName.50. Merci.

6 votes

La même réponse a été donnée trois ans plus tôt .

1 votes

Peut-on mettre un nombre dynamique comme "ArrayName.<some_num>" dans la requête ?

0 votes

Oui, vous pouvez utiliser n'importe quel numéro. Si vous voulez récupérer un enregistrement supérieur à N, passez n.

47voto

Dada Points 104

MongoDB 3.6 include $expr https://docs.mongodb.com/manual/reference/operator/query/expr/

Vous pouvez utiliser $expr afin d'évaluer une expression à l'intérieur d'un $match, ou find.

{ $match: {
           $expr: {$gt: [{$size: "$yourArrayField"}, 0]}
         }
}

ou trouver

collection.find({$expr: {$gte: [{$size: "$yourArrayField"}, 0]}});

2 votes

Bien que correcte, cette réponse est un doublon. Voir stackoverflow.com/a/48410837/2424641 par @user2683814

44voto

Zloy Smiertniy Points 395

Aucune des propositions ci-dessus n'a fonctionné pour moi. Celle-ci a marché, alors je la partage :

db.collection.find( {arrayName : {$exists:true}, $where:'this.arrayName.length>1'} )

2 votes

Javascript s'exécute plus lentement que les opérateurs natifs fournis par mongodb, mais il est très flexible. voir : stackoverflow.com/a/7811259/2893073 Donc la solution finale est : stackoverflow.com/a/15224544/2893073

27voto

Yadvendar Points 51
db.accommodations.find({"name":{"$exists":true, "$ne":[], "$not":{"$size":1}}})

2 votes

Cette méthode ne s'adapte pas bien à d'autres tailles minimales (10, par exemple).

0 votes

Même que la première réponse

15voto

Steffan Perry Points 432

Bien que les réponses ci-dessus fonctionnent toutes, ce que vous avez essayé de faire à l'origine était la bonne méthode, mais vous avez simplement la syntaxe à l'envers (permuter "$size" et "$gt") .

Correct :

db.collection.find({items: {$gt: {$size: 1}}})

C'est faux :

db.collection.find({items: {$size: {$gt: 1}}})

2 votes

Je ne vois pas pourquoi tant de downvotes - cela fonctionne parfaitement pour moi !

0 votes

Fonctionne parfaitement bien, v 4.2.5

1 votes

Toujours indiquer la version lorsqu'on poste des solutions de ce genre. ne fonctionne pas sur 4.2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X