2016-12-09 1 views
3

Использование механизма агрегации в Монго,

Как я могу достичь того же результата в Монго < 3,2 как в Монго 3.2 с операцией $ arrayElemAt?

Пример в Монго 3.2

Коллекция

{ "_id" : 1, "name" : "dave123", favorites: [ "chocolate", "cake", "butter", "apples" ] } 

Запрос

db.users.aggregate([ 
    { 
    $project: 
     { 
     name: 1, 
     first: { $arrayElemAt: [ "$favorites", 0 ] }, 
     last: { $arrayElemAt: [ "$favorites", -1 ] } 
     } 
    } 
]) 

Он отлично работает

Но, я был вынужден использовать Mongo 3.0, поэтому я не могу использовать этот оператор, который идеально подходит для того, что я хочу сделать.

Есть ли способ доступа к элементу массива по индексу с чем-то вроде. ..

Монго 3,0

Коллекция

{ "_id" : 1, "name" : "dave123", favorites: [ "chocolate", "cake", "butter", "apples" ] } 

Запрос

db.users.aggregate([ 
    { 
    $project: 
     { 
     name: 1, 
     first: { "$favorites.0" }, 
     last: { "$favorites.1" } 
     } 
    } 
]) 

Я пробовал, и он не работает, он дает мне пустой массив.

Однако, когда они являются свойствами, а не индексов она способна получить значения

Любая помощь будет очень ценна.

Благодаря

ответ

4

Вам нужно будет $unwind, $group и использовать $first и $last операторы, как это:

db.collection.aggregate([ 
    { "$unwind": "$favorites" }, 
    { "$group": { 
     "_id": "$_id", 
     "first": { "$first": "$favorites" }, 
     "last": { "$last": "$favorites" } 
    }} 
]) 

Или два различных запросов, если $unwind дорого

var first = db.collection.find({}, {"favorites": { $slice: 1}}) 
var last = db.collection.find({}, {"favorites": { $slice: -1}})