运算符$ arrayElemAt与Mongo< 3.2

时间:2016-12-09 09:43:30

标签: javascript mongodb mongodb-query aggregation-framework

在Mongo中使用聚合框架,

如何在 Mongo<中获得相同的结果? 3.2 ,如 Mongo 3.2 ,操作 $ arrayElemAt

Mongo 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,所以我不能使用这个操作符,这对我想做的事情来说是理想的

有没有办法通过索引来访问数组的元素...

Mongo 3.0

集合

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

查询

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

我试过但它不起作用,它给了我一个空数组。

但是,当它们是属性而不是索引时,它能够检索值

任何帮助都会非常感激。

由于

1 个答案:

答案 0 :(得分:7)

您需要$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}})