Получить n-й элемент массива в MongoDB - PullRequest
36 голосов
/ 28 августа 2011

Как часть моего документа в MongoDB, я храню массив объектов. Как я могу запросить его только для 4-го элемента массива, например? Поэтому я не хочу получать весь массив, только 4-й элемент.

Ответы [ 3 ]

58 голосов
/ 29 августа 2011

Используйте $slice.

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

извлечет n-й элемент массива "my_array" из всех документов в коллекции foo, где bar = "xyz".

Некоторые другие примеры из документации 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

, которые вы можете прочитать здесь: http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

9 голосов
/ 20 июля 2016

Вы можете использовать оператор $arrayElemAt, новый в MongoDB 3.2, чтобы вернуть элемент с указанным индексом массива.


Демонстрация:

Коллекцияnamed baskets содержит документы, которые выглядят следующим образом:

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

Следующий запрос возвращает элемент с индексом -2 (второй элемент) в массиве "fruits".

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

, который производит

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

И следующий запрос элемента перед последним элементом в массиве;таким образом, элемент с индексом -2

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

, который дает:

{ 
    "_id" : ObjectId("578f326f6db61a299a383c5a"), 
    "matched" : "apricot" 
}
8 голосов
/ 05 августа 2013

Другой способ сделать это - использовать синтаксис массива обновления. Здесь contribs.1 устанавливает для второго элемента в массиве contribs значение ALGOL 58 (взято со страницы руководства по синтаксису обновления )

db.bios.update(
   { _id: 1 },
   { $set: { 'contribs.1': 'ALGOL 58' } }
)
...