2016-11-01 2 views
0

У меня есть много объектов с большим массивом для каждого из этих объектов в БД. Я хочу получить первый и последний элемент массива (слишком много данных, если я получаю все массивы). Как мне это сделать ? Я попытался это:Получить определенный индекс в массиве Mongo

db.my_collection.findOne({my_query:'is_awesome'}, {'big_array.0':1}) 

, но это не работает ... Спасибо'S!

ответ

1

Вы можете использовать агрегацию вместо findOne, выполняя команду $match.

В MongoDB 3.2, есть в агрегации $slice, так что вы можете $slice элемент в положении 1 и -1:

db.my_collection.aggregate([{ 
    $match: { my_query: 'is_awesome' } 
}, { 
    $project: { 
     my_query: 1, 
     firstElement: { $slice: ["$big_array", 1] }, 
     lastElement: { $slice: ["$big_array", -1] } 
    } 
}]) 

В MongoDB < 3.2 $slice наклоняю быть использованы в агрегации, так что вы можете использовать $unwind и $group, следующее работает в MongoDB 3.0:

db.my_collection.aggregate([{ 
    $match: { my_query: 'is_awesome' } 
}, { 
    $unwind: "$big_array" 
}, { 
    $group: { 
     _id: "$_id", 
     my_query: { $first: "$my_query" }, 
     firstElement: { $first: "$big_array" }, 
     lastElement: { $last: "$big_array" } 
    } 
}]) 
+0

Спасибо'S! Он доступен только для версии MongoDB версии 3.1? – BNilsou

+0

Он должен работать от mongodb 2.4 –

+0

'' 'mongo --version''' дать мне 3.0.8. Тогда у меня есть следующая ошибка с трюком: '' 'assert: command failed: { " errmsg ":" exception: invalid operator '$ slice' ", " code ": 15999, " ok ": 0 }: агрегат не удалось ошибка: команда не удалось: { "ERRMSG": "исключение: недействительный оператор '$' ломоть", "код": 15999, "оК": 0 }: совокупный failed''' сделал Я что-то пропустил? – BNilsou

Смежные вопросы