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]}

13voto

Barrard Points 338

J'ai trouvé cette solution, pour trouver les éléments dont le champ du tableau est supérieur à une certaine longueur.

db.allusers.aggregate([
  {$match:{username:{$exists:true}}},
  {$project: { count: { $size:"$locations.lat" }}},
  {$match:{count:{$gt:20}}}
])

Le premier agrégat $match utilise un argument qui est vrai pour tous les documents. S'il était vide, j'obtiendrais

"errmsg" : "exception: The argument to $size must be an Array, but was of type: EOO"

0 votes

C'est essentiellement la même réponse que celui-ci fourni 2 ans plus tôt.

9voto

Nagabhushan Baddi Points 802

Vous pouvez utiliser l'agrégation MongoDB pour effectuer cette tâche :

db.collection.aggregate([
  {
    $addFields: {
      arrayLength: {$size: '$array'}
    },
  },
  {
    $match: {
      arrayLength: {$gt: 1}
    },
  },
])

7voto

Bhagvat Lande Points 140

Je sais que c'est une vieille question, mais j'essaie ceci avec $gte et $size dans find. Je pense que find() est plus rapide.

db.getCollection('collectionName').find({ name : { $gte : {  $size : 1 } }})

7 votes

Cela ne fonctionne pas.

0 votes

Ici le nom est le tableau dans le doc, pouvez-vous s'il vous plaît ajouter plus de détails afin que je puisse aider

1 votes

Oui, ça marche.

-2voto

mehmood-zaman Points 26
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

vous pouvez utiliser $gt et $lt en demande.

1 votes

Cela renvoie les documents dans lesquels le dim_cm Le tableau contient une valeur dans la plage (22,30). Rien à voir avec taille du tableau.

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