web-dev-qa-db-fra.com

Récupère le nième élément d'un tableau dans MongoDB

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

36
mck

Utilisation $slice.

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

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

Quelques autres exemples de la documentation MongoDB:

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+a+Subset+of+Fields

59
Russell

Vous pouvez utiliser le $arrayElemAt opérateur nouveau dans MongoDB 3.2 pour renvoyer l'élément à l'index de tableau spécifié.


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 ce qui suit interroge l'élément avant le dernier élément du tableau; donc l'élément à l'index -2

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

ce qui donne:

{ 
    "_id" : ObjectId("578f326f6db61a299a383c5a"), 
    "matched" : "apricot" 
}
9
styvane

Pour ce faire, vous pouvez également utiliser la syntaxe du tableau de mise à jour. Ici, contribs.1 définit le deuxième élément du tableau contribs comme ayant 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
Eskoala