Obtenir l'élément n-th d'un tableau en MongoDB

dans mon document en MongoDB, je stocke un tableau d'objets. Comment puis-je interroger pour seulement le 4e élément du tableau par exemple? Donc je ne veux pas que tout le tableau soit sorti, juste le 4ème élément.

30
demandé sur styvane 2011-08-28 23:14:47

3 réponses

Utiliser $slice.

db.foo.find({ bar : "xyz" } , { my_array : { $slice : [n , 1] } } )

va récupérer le nième élément du tableau "my_array "de tous les documents de la collection foo où bar = "xyz".

Quelques autres exemples de MongoDB documentation:

db.posts.find({}, {comments:{$slice: 5}}) // first 5 comments
db.posts.find({}, {comments:{$slice: -5}}) // last 5 comments
db.posts.find({}, {comments:{$slice: [20, 10]}}) // skip 20, limit 10
db.posts.find({}, {comments:{$slice: [-20, 10]}}) // 20 from end, limit 10

que vous pouvez lire ici: http://www.mongodb.org/display/DOCS/Retrieving+une+sous-ensemble+de+Champs

53
répondu Russell 2013-07-17 07:16:06

une autre façon de faire ceci est d'utiliser la syntaxe du tableau update. Ici,contribs.1 définit la deuxième dans l'élément contribs tableau de la valeur ALGOL 58(tiré de la page de manuel sur la syntaxe de mise à jour)

db.bios.update(
   { _id: 1 },
   { $set: { 'contribs.1': 'ALGOL 58' } }
)
8
répondu Eskoala 2014-03-25 08:42:17

Vous pouvez utiliser le $arrayElemAt nouvel opérateur dans MongoDB 3.2 pour retourner l'élément à l'index de tableau.


Démo:

Une collection nommée paniers contient des documents qui ressemblent à ceci:

{
    "_id" : ObjectId("578f326f6db61a299a383c5a"),
    "fruits" : [
        "apple",
        "mango",
        "banana",
        "apricot",
        "cherry"
    ]
}

la requête suivante renvoie l'élément à l'index -2 (deuxième élément) dans le tableau" fruits".

db.baskets.aggregate(
    [
        { "$project": { "matched": { "$arrayElemAt": [ "$fruits", 1 ] } } } 
    ] 
)

qui produit

{ 
    "_id" : ObjectId("578f326f6db61a299a383c5a"), 
    "matched" : "mango" 
}

Et la requête suivante l'élément avant que le dernier élément du tableau; ainsi l'élément à l'index -2

db.baskets.aggregate(
    [
        { "$project": { "matched": { "$arrayElemAt": [ "$fruits", -2 ] } } } 
    ] 
)

ce qui donne:

{ 
    "_id" : ObjectId("578f326f6db61a299a383c5a"), 
    "matched" : "apricot" 
}
7
répondu styvane 2016-07-20 08:24:22