2016-12-09 87 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}})