如何从嵌套的mongodb {'key':value}对中构建“值”数组?

时间:2018-09-25 23:41:45

标签: python mongodb

下面是我通过使用点符号将一个数据库映射到另一个数据库而创建的数据库:

for ladders in season_ladders_db2.ladders.find({},{'tier.division.ladder_id':1}):
    db_ladder_id.ladders.insert_one(ladders)

输出:

{'_id': ObjectId('5baa8d09a4918a1cc0ed16e2'),
 'tier': [{'division': [{'ladder_id': 198440},
                        {'ladder_id': 197477},
                        {'ladder_id': 198936},
                        {'ladder_id': 197279},
                        {'ladder_id': 199169},
                        {'ladder_id': 197611},
                        {'ladder_id': 197365},
                        {'ladder_id': 197803},
                        {'ladder_id': 198683},
                        {'ladder_id': 197062}]},
          {'division': [{'ladder_id': 197053},
                        {'ladder_id': 198094},
                        {'ladder_id': 199170},
                        {'ladder_id': 198417},
                        {'ladder_id': 197792},
                        {'ladder_id': 197342},
                        {'ladder_id': 197507}]},
          {'division': [{'ladder_id': 197310},
                        {'ladder_id': 197620},
                        {'ladder_id': 197968},
                        {'ladder_id': 198774},
                        {'ladder_id': 197405},
                        {'ladder_id': 198366},
                        {'ladder_id': 197065},
                        {'ladder_id': 199163},
                        {'ladder_id': 197522},
                        {'ladder_id': 198550},
                        {'ladder_id': 198132},
                        {'ladder_id': 197780},
                        {'ladder_id': 198992}]}]}
{'_id': ObjectId('5baa8d0aa4918a1cc0ed16e3'),
 'tier': [{'division': [{'ladder_id': 197921}]}]}

如何使用Python和PyMongo构建仅由'ladder_id'值组成的数组?

输出需求类似于

[198440, 197477, 198936, ...] 

有没有一种方法可以在mongodb中传递这些值?也许去另一个收藏?我想将这些值传递给API调用。

谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您需要将({$unwind)个值和项目($projectladder_id拆包到查询结果的根。

db.getCollection('test').aggregate(
[
  {$unwind: '$tier'},
])

此查询实际上将展开tier,这意味着所有division都将拥有自己的tier

{
    "_id" : ObjectId("5baace3569cb14ccb9e5dfc5"),
    "tier" : {
         "division" : [ 
            {
                "ladder_id" : 197921
            }
        ]
    }
}, {}, {}, .....

然后,您需要放开这些division,以便所有这些ladder_id拥有自己的tierdivision

db.getCollection('test').aggregate(
[
  {$unwind: '$tier'},
  {$unwind: '$tier.division'},
])

结果:

{
    "_id" : ObjectId("5baace2769cb14ccb9e5df34"),
    "tier" : {
        "division" : {
            "ladder_id" : 198440
        }
    }
}, {}, {}, .....

最后,您可以$projectladder_id

db.getCollection('test').aggregate(
[
  {$unwind: '$tier'},
  {$unwind: '$tier.division'},
  {$project: {ladder_id: '$tier.division.ladder_id'}},
])

结果:

{
    "_id" : ObjectId("5baace2769cb14ccb9e5df34"),
    "ladder_id" : 198440
}, {}, {}, .....