【问题标题】:couldn't dispaly results using format in pymongo无法在 pymongo 中使用格式显示结果
【发布时间】:2022-01-22 06:39:20
【问题描述】:

我正在使用 jupyter notebook,pymongo。 我正在尝试使用格式显示我的结果。

这是我收藏的一个例子user

"_id": {
    "$oid": "61bd0b558659f89f7e5b1c56"
  },
  "first_name": "Brandise",
  "last_name": "Ingerman",
  "email": "bingerman0@youku.com",
  "gender": "Female",
  "address": {
    "city": "Fresno",
    "state": "California",
    "country": "United States",
    "country_code": "US"
  },
  "card": {
    "card_number": "3571237735836521",
    "card_type": "jcb",
    "currency_code": "USD",
    "balance": 630.16
  },
  "married_status": "true"

这是我正在执行的查询

pipeline = [
   {
      "$match":{
         "card.card_type": "jcb"
      }
   },
   {
      "$sort":{
         "card.balance":-1
      }
   }
]
results = users.aggregate(pipeline)
for user in results:
   print(" * user name: {first_name}, card number: {card_number}, balance: {balance}".format(
         first_name=user["first_name"],
         card_number=user["card.card_number"],
         balance=user["card.balance"],
   ))

它说

     15    print(" * user name: {first_name}, card number: {card_number}, balance: {balance}".format(
     16          first_name=user["first_name"],
---> 17          card_number=user["card.card_number"],
     18          balance=user["card.balance"],
     19    ))

KeyError: 'card.card_number'

我试过拨打card_number,但一直提示错误,不知道怎么弄。

【问题讨论】:

    标签: python jupyter-notebook pymongo


    【解决方案1】:
    card_number=user["card"]["card_number"]
    balance=user["card"]["balance"]
    

    这应该可行。返回的 MongoDB 文档应该是嵌套字典格式。因此,您需要逐步访问内部字典的键。还建议您将从 mongo 获取的数据转换为 python 列表。从长远来看,这会让事情变得更容易。

    【讨论】:

      【解决方案2】:

      您的收藏中是否包含不存在 card.card_number 键的条目?

      尝试运行此查询以查看是否有:

      users.find({"card.card_number": {$exists: False}})

      【讨论】:

      • 我用过,没有提示。
      • 如果我使用它而不是格式,它可以正常工作。但我想使用格式
      • for user in results: print(json_util.dumps(user,indent=2))
      • 我说的是那个代码
      • 可能是 dict 键在期间被拆分。试试card_number=user["card"]["card_number"]
      【解决方案3】:
      pipeline = [
         {
            "$match":{
               "card.card_type": "jcb"
            }
         },
         {
            "$sort":{
               "card.balance":-1
            }
         }
      ]
      results = users.aggregate(pipeline)
      for user in results:
         print(" * user name: {first_name}, card number: {card_number}, balance: {balance}".format(
               first_name=user["first_name"],
               card_number=user["card"]["card_number"],
               balance=user["card"]["balance"],
         ))
      

      【讨论】:

      • @derpinette 如果我或其他用户的回答是您问题的解决方案,请按照 Stackoverflow 帮助中心规则接受该回答,谢谢
      猜你喜欢
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      相关资源
      最近更新 更多