Получить n-й элемент массива в MongoDB

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


person mck    schedule 28.08.2011    source источник
comment
Или, возможно, достижение объектов Элемент массива по положению   -  person drpoo    schedule 09.10.2012


Ответы (3)


Используйте 1_.

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

person Russell    schedule 28.08.2011
comment
небольшая поправка к вашей строке db.foo.find({bar: xyz}, {my_array: {$slice: [n, 1]}}}) извлечет n-й элемент массива my_array всех документов в коллекции foo, где bar = хиз. я думаю, что это даст (n+1)-й элемент из массива my_array, потому что $slice: [n, 1] означает пропуск n, ограничение 1, поэтому он вернет n+1-й элемент из массива - person Bravo; 12.07.2014

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


Демо:

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

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

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

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" 
}
person styvane    schedule 20.07.2016

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

db.bios.update(
   { _id: 1 },
   { $set: { 'contribs.1': 'ALGOL 58' } }
)
person Eskoala    schedule 05.08.2013
comment
Но мы ищем get элемент, а не push элемент :? - person fguillen; 30.08.2016
comment
Поскольку сообщение не пытается ответить на исходный вопрос и не является полезным, подумайте о том, чтобы проголосовать против него, чтобы дать ему шанс быть удаленным. - person Arseni Mourzenko; 12.04.2021