收集集合中字段的所有值

时间:2021-03-20 00:04:50

标签: python mongodb pymongo

我有一个 MongoDB 数据库,每个集合都采用这种形式:

'id': '1',
'TopKey':{
    '4':[
        {'name':'name1', 
         'age':18, 
         'dimensions':
             [{'weight':125, 'height':72}], 
         'meals':
            [{'breakfast':2, 'lunch':7, 'dinner':7}]
         },
        {'name':'name2', 
         'age':21, 
         'dimensions':
             [{'weight':137, 'height':69}], 
         'meals':
            [{'breakfast':0, 'lunch':7, 'dinner':6}]
         }
        ],
    '5':[
        {'name':'name1', 
         'age':18, 
         'dimensions':
             [{'weight':130, 'height':72}], 
         'meals':
            [{'breakfast':5, 'lunch':7, 'dinner':7}]
         },
        {'name':'name2', 
         'age':21, 
         'dimensions':
             [{'weight':140, 'height':69}], 
         'meals':
            [{'breakfast':7, 'lunch':6, 'dinner':6}]
         }
        ]}

我想查询此数据库并获取所有 ageweight 值的列表。

我试过这样查询,但它不适应,因为 TopKey 中的键可以是许多不同的数字集(有时是 0,1,2 有时是 4,5,8,9,例如)

a = db.collection_name.find({},{'TopKey.4.age'})
print(a[0])

> {'id': 1,
    'TopKey':{'4': [
        {'age':18},
        {'age':21}]}}

我想要所有集合中所有 age 的列表。我也尝试使用 distinct('TopKey.4.age') 但它只收集列表中的唯一值。我正在寻找类似 distinct() 的东西,它以原始顺序从整个集合中返回值。

1 个答案:

答案 0 :(得分:0)

您需要遍历记录结构,并且可以使用 set 来跟踪唯一值:

records = db.collection_name.find({}, {'TopKey': 1})

ages = set()

for record in records:
    for k, v in record.get('TopKey').items():
        for item in v:
            ages.add(item.get('age'))

print(ages)

印刷品:

{18, 21}