Obtenir l'élément n-th d'un tableau en MongoDB
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
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' } }
)
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"
}