web-dev-qa-db-fra.com

Interroger MongoDB pour qu'il corresponde au premier élément d'un tableau

Je connais l'opérateur $in, Qui semble rechercher la présence d'un élément dans le tableau, mais je ne veux trouver une correspondance que si l'élément est en première position dans un tableau.

Par exemple:

{
    "_id" : ObjectId("0"),
    "imgs" : [
        "http://foo.jpg",
        "http://bar.jpg",
        "http://moo.jpg",
        ]
},
{
    "_id" : ObjectId("1"),
    "imgs" : [
        "http://bar.jpg",
        "http://foo.jpg",
        "http://moo.jpg",
        ]
}

Je recherche une requête similaire à:

db.products.find({"imgs[0]": "http://foo.jpg"})

Cela devrait/devrait retourner la ObjectId("0") mais pas ObjectId("1"), car elle vérifie uniquement la première image du tableau.

Comment cela peut il etre accompli? Je suis conscient que je pourrais simplement créer un champ séparé qui contient une seule chaîne pour firstImg mais ce n'est pas vraiment ce que je cherche ici.

37
JVG

Je crois que vous voulez imgs.0. par exemple, étant donné votre exemple de document, vous voulez dire: db.products.find({"imgs.0": "http://foo.jpg"})

N'oubliez pas que le référencement d'index de tableau ne fonctionne que pour le tableau de premier niveau. Mongo ne prend pas en charge la recherche d'index de tableau plus en profondeur.

71
poundifdef

Vous pouvez utiliser la notation par points pour les index de tableau:

db.products.find({"imgs.0": "http://foo.jpg"})

Voici un extrait de la documentation pertinente pour notation par points .

MongoDB utilise la notation par points pour accéder aux éléments d'un tableau et accéder aux champs d'un sous-document.

Pour accéder à un élément d'un tableau par la position d'index de base zéro, concaténer le nom du tableau avec le point (.) Et la position d'index de base zéro, et mettre entre guillemets:

'<array>.<index>'

De plus, voici un lien vers la documentation du tablea .

11
Lix