2 votes

Utilisation d'une requête Mongo pour trouver un élément dans un tableau

J'ai des enregistrements dans ma base de données avec cette structure :

{ 
  "_id" : "YA14163134", 
  "discount" : "", 
  "retail" : "115.0000", 
  "cost" : "", 
  "description" : "Caterpillar Mens Big Twist Analog Watch", 
  "stock_update" : "05", 
  "brand" : "Kronos", 
  "img_url" : "image2342000.jpg", 
  "UPC" : "4895053708012", 
  "stock" : [ [ "1611292138", "5" ], [ "1612032232", "4" ], [ "1612050918", "0" ] ] 
}

et je cherche une requête pour obtenir tous les enregistrements qui ont dans "stock" la valeur "1612050918". C'est l'identifiant de mise à jour.

Essayez quelque chose comme :

db.vlc.find({stock: {$elemMatch:{$all:["1612050918"]}}})

ou

db.vlc.find({stock: { $in : ['1611292138']}})

ou

db.vlc.find({stock: { $all : [[1611292138]]}})

sans résultat. Cela ne fonctionne que si j'inclus dans la requête le deuxième élément du tableau comme ici

db.vlc.find({stock: { $all : [['1611292138', '7']]}})

mais cela limite ma demande à tous les éléments de la mise à jour avec qnty 7 alors que j'ai besoin de n'importe quel qnty. Merci d'avance !

1voto

sean9999 Points 334

Utiliser cette requête :

{
    "stock" : {
        "$elemMatch" : {
            "$elemMatch" : {
                "$eq" : "1611292138"
            }
        }
    }
}

Explication :

  • Le premier $elemMatch vous permet de balayer les trois tableaux sous stock
  • Le nex $elemMatch permet d'analyser les deux éléments des sous-réseaux.
  • puisque $elemMatch requiert un objet de requête, la notation $eq est utilisée pour une correspondance littérale.

Si vous savez que "1611292138" sera toujours le premier du sous-réseau, votre requête devient plus simple :

{ "stock" : { "$elemMatch" : { "0" : "1611292138" } } }

Explication :

  • Analyser tous les tableaux sous stock
  • Recherchez "1611292138" dans le premier emplacement de chaque sous-réseau.

0voto

yogesh Points 354

Utiliser des éléments imbriqués $elemMatch comme ci-dessous :

db.vlc.find({stock: { "$elemMatch":{"$elemMatch":{"$all":["1612050918"]}}}})

Ou

 db.vlc.find({stock: {"$elemMatch":{ "$elemMatch":{"$in" : ["1612050918"]}}}})

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