【问题标题】:mongodb aggregate to get length of first nested array/listmongodb聚合以获取第一个嵌套数组/列表的长度
【发布时间】:2015-02-16 10:10:45
【问题描述】:

我有下面的例子

{ 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 也可能有类似 [] 的空列表。

【问题讨论】:

    标签: mongodb aggregation-framework nested-lists


    【解决方案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}
    

    【讨论】:

    • 这不起作用。我的标签是 objectIds 列表的列表。此代码返回给我一个空列表
    • @rkatkam objectIDs 应该也可以,发布您的文件之一
    • @rkatkam $unwind 在哪里?请张贴您的一份文件
    • 我发布了文件。请看一下,因为我还没有找到任何解决方案
    • @rkatkam 检查答案
    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2016-03-04
    • 2020-01-21
    相关资源
    最近更新 更多