mongodb聚合以获取第一个嵌套数组/列表的长度

时间:2015-02-16 10:10:46

标签: mongodb aggregation-framework nested-lists

我有以下示例

{ username : 'Alex', tags: ['C#', 'Java', 'C++'] }

获取标签数组的长度

db.users.aggregate(
[
  {
     $project: {
        tags_count: {$size: "$tags"}
     }
  }
]
)

但是当我有嵌套列表时如何获得长度

{ username : 'Alex', tags: [['C#', 'Java', 'C++']] }


res = collection.aggregate([{
    "$match": query
},{
    "$project": {
      "_id": 0,
      "name": "$name",
      "a1":{"$properties.has_a":{"$slice":1}}, //Line #a1
    }
}])

我也尝试按如下方式更改Line#a1:

res = collection.aggregate([{
    "$match": query
},{'$group':{'_id':{'a_list':{'$first':"$properties.has_a"}}}},{
    "$project": {
      "_id": 0,
      "name": "$name",
      "a1":{"$size":'$id.a_list'}, //Line #a1
    }
}])

但没有任何工作按预期进行

文件:

{
  u'_id': ObjectId('54ddcd23f084a315hju481ea'),
  u'properties': [
      {u'start_time': datetime.datetime(2015, 2, 13, 0, 0)},
      {u'end_time': datetime.datetime(2015, 2, 13, 0, 0)},
      {u'status': u'APPROVAL'},
      {u'has_a': [
            ObjectId('54ddc9d6f084a517dfebdeff'),
            ObjectId('54ddc9dbf084a397dfebdf1a')
        ]
       }
      {u'has_b': [
            ObjectId('54ddf9d6f084a317dfebdeff'),
            ObjectId('54dhj9dbf084a317dfebdf1a')
        ]
       }
  ]
}

也可能会发生has_a有空列表,如[]。

1 个答案:

答案 0 :(得分:1)

正如我在comments中说的那样,$unwind阶段后跟$project& $size会解决您的问题:

[
   {
        $unwind : "$tags"
   },
   {
        $project: {
               tags_count: {$size: "$tags"}
        }
   }
]

给了我这份文件:

{
    tags_count: 3
}

这回答了你的新问题:

[
    {
         $unwind : "$properties"
    },
    {
         $unwind : "$properties.has_a"
    },
    {
         $group: {
             _id: null,
             count: {
                 $sum: 1
             }
          }
    }
]

返回以下内容:

{ count: 2}