Как часть моего документа в MongoDB я храню массив объектов. Как я могу запросить его только для 4-го элемента массива, например? Поэтому я не хочу получать весь массив, только 4-й элемент.
Получить n-й элемент массива в MongoDB
Ответы (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
Вы можете использовать оператор $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"
}
Другой способ сделать это — использовать синтаксис массива обновления. Здесь contribs.1
устанавливает для второго элемента в массиве contribs
значение ALGOL 58
(взято из страница руководства по синтаксису обновления)
db.bios.update(
{ _id: 1 },
{ $set: { 'contribs.1': 'ALGOL 58' } }
)
get
элемент, а не push
элемент :?
- person fguillen; 30.08.2016