我有以下示例
{ 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有空列表,如[]。
答案 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}