首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不可理解的类型:在pymongo中使用push时的“列表”

不可理解的类型:在pymongo中使用push时的“列表”
EN

Stack Overflow用户
提问于 2022-07-20 08:17:11
回答 1查看 77关注 0票数 1

我目前正在做一个网络抓取项目。我们的目标是每天恢复gaz站(900+)不同类型燃料的价格。如果价格发生变化,脚本将能够将新的价格附加到Mongodb数据库中。

收集的数据如下:

代码语言:javascript
运行
复制
Price_post_api = {

    "station_id": 31200009,
    "price_detail": [
      {
        "fuel_id": 1,
        "fuel_name": "Gazole",
        "fuel_cost": 1.959,
        "update_date": {
          "$date": "2022-05-30T10:05:22Z"
        }
      },
      {
        "fuel_id": 2,
        "fuel_name": "SP95",
        "fuel_cost": 2.049,
        "update_date": {
          "$date": "2022-05-30T10:05:23Z"
        }
      },
      {
        "fuel_id": 5,
        "fuel_name": "E10",
        "fuel_cost": 2.009,
        "update_date": {
          "$date": "2022-05-30T10:05:23Z"
        }
      }
    ]
  },

我很难弄清楚如何基于$push字段正确地对Mongodb中的数据进行"fuel_cost"处理。这里是数据库中预期输出的一个示例。

代码语言:javascript
运行
复制
Mongodb_price_data ={
    "station_id": 31200009,
    "price_detail": [
      {
        "fuel_id": 1,
        "fuel_name": "Gazole",
        "fuel_cost": 1.959,
        "update_date": {
          "$date": "2022-05-30T10:05:22Z"
        }
      },
      {
        "fuel_id": 1,
        "fuel_name": "Gazole",
        "fuel_cost": 35.87,
        "update_date": {
          "$date": "2022-05-31T10:09:22Z"
        }
      },
      {
        "fuel_id": 2,
        "fuel_name": "SP95",
        "fuel_cost": 2.049,
        "update_date": {
          "$date": "2022-05-30T10:05:23Z"
        }
      },
      {
        "fuel_id": 2,
        "fuel_name": "Gazole",
        "fuel_cost": 1.59,
        "update_date": {
          "$date": "2022-07-14T00:10:19Z"
        }
      },
      {
        "fuel_id": 5,
        "fuel_name": "E10",
        "fuel_cost": 2.009,
        "update_date": {
          "$date": "2022-05-30T10:05:23Z"
        }
      }
    ]
}

到目前为止,我创建了以下函数:

代码语言:javascript
运行
复制
def update_new_price(station_id, fuel_id, fuel_name, cost):
    query = {'station_id':station_id, 'price_detail.fuel_id':fuel_id, 'price_detail.fuel_name':fuel_name,'price_detail.fuel_cost':cost}
    new_value = {
        '$push':{
            'price_detail':{
                [{'price_detail.fuel_id': fuel_id,'price_detail.fuel_name':fuel_name ,'price_detail.fuel_cost':cost}]
            }}}
    result = db[CL_PRICE].find(query)
    if not list(result):
        db[CL_PRICE].update_one(query,new_value,upsert= True)
        print('new value added')
    else:
        print('Already exists')

一旦我运行我的代码,我就会收到一条错误消息。

代码语言:javascript
运行
复制
  'price_detail':{
TypeError: unhashable type: 'list'

你知不知道为什么我能修好它?

EN

回答 1

Stack Overflow用户

发布于 2022-07-28 02:07:36

我想你需要在那里拆下额外的弧形支撑。

而不是

代码语言:javascript
运行
复制
            'price_detail':{
                [{'price_detail.fuel_id': fuel_id,'price_detail.fuel_name':fuel_name ,'price_detail.fuel_cost':cost}]
            }

它应该是商店

代码语言:javascript
运行
复制
            'price_detail': [
                {'price_detail.fuel_id': fuel_id,'price_detail.fuel_name':fuel_name ,'price_detail.fuel_cost':cost}
            ]

实际上,您正在尝试创建一个由一个元素组成的集合,该元素是一个列表。并且set只能包含列表不包含的可选对象。

一个最小的可重复的例子是

代码语言:javascript
运行
复制
>>> {[1, 2, 3]}
Traceback (most recent call last):
  Input In [2] in <cell line: 1>
    {[1, 2, 3]}
TypeError: unhashable type: 'list'

中间没有{}:是创建集合的语法。为了清晰起见,下面是一些创建集合的正确方法的示例。

代码语言:javascript
运行
复制
>>> {(1, 2, 3)}  # a set containing a single tuple
{(1, 2, 3)}
>>> {*[1, 2, 3]}  # a set of three elements created from a list
{1, 2, 3}
>>> {1, 2, 3}  # a set created from three values
{1, 2, 3}
>>> {x for x in range(1, 4)}  # a set comprehension expression
{1, 2, 3}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73048139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档