【问题标题】:How to know the last time a product has been updated MongoD?如何知道产品最后一次更新 MongoD 的时间?
【发布时间】:2021-12-24 18:47:27
【问题描述】:

我正在处理一个项目,我想按 2 个月内或确定日期内未更新的产品进行过滤。(在过去 2 个月或任何其他日期没有新商品价格)我想要) 我想用python做脚本。

我所有的数据库都是遵循这个结构的 json:

为了访问它,我执行 mongo_client[db_name][coll_name] 然后我通常使用 .find() 或 .aggregate()

{
    "_id" : ObjectId("6188f511091533324af78fbf"),
    "market" : "x",
    "product" : "apple",
    "item_price_history" : [ 
        {
            "item_price" : 219.0,
            "date" : ISODate("2021-04-08T15:30:43.000Z")
        }, 
        {
            "item_price" : 248.0,
            "date" : ISODate("2021-04-22T08:02:28.000Z")
}

您知道我该怎么做吗?我使用最新版本的 Python 和 Robo 3T-1.4

提前致谢

【问题讨论】:

  • 你试过排序item_price_history(这是一个字典列表)

标签: python python-3.x mongodb robo3t


【解决方案1】:

您可以查看item_price_history 中的数据以检查该字段的上次更新时间。但是您似乎没有办法跟踪其他字段的更新时间。

接下来,如果您使用像 MongoEngine 这样的 ODM,您可以尝试添加一个预保存挂钩来存储上次更新的日期时间。

参考pre_save方法here

【讨论】:

  • 你知道我怎么知道自确定日期以来是否有任何字段被更新?这也可能对我有用。谢谢
  • 正如我所提到的,您现在可以使用item_price_history 来使用filter 方法获取您想要的数据。但是如果你添加了pre_save 钩子,你可以自动更新你想要的字段。因此,您可以添加一个挂钩,将updated_at 字段设置为当前时间戳。这样,每当更新文档时,updated_at 字段也将得到更新。然后,您可以使用它来过滤您想要作为查询本身的一部分的文档。
【解决方案2】:
import dateutil.parser

list_to_sort = {
     "market" : "x",
     "product" : "apple",
     "item_price_history" : [
         {
             "item_price" : 219.0,
             "date" : "2021-04-08T15:30:43.000Z"
         },
         {
             "item_price" : 248.0,
             "date" : "2021-04-22T08:02:28.000Z"
         }]
}

candidates = list_to_sort.values()

for item in candidates:
    if isinstance(item,list):
        list_to_sort = item



def myfunc(item):
    time = dateutil.parser.parse(item["date"])
    return time.timestamp()

list_to_sort.sort(key=myfunc)
print(list_to_sort)

这将根据自定义函数myfunc对列表进行排序

【讨论】:

  • 我的问题是我的数据库存储在 [mongo_db][db_name][coll_name] 中。 db_name 是 db 的名称,而 coll_name 是确切的文件。所以我不能像这样使用 list_to_sort 。无论如何,谢谢你,我会尝试实现这一点,但如果你有任何其他建议,请告诉我。使用您的代码,我收到此错误:“TypeError("'Collection' object is not callable. If you mean to " TypeError: 'Collection' object is not callable. If you mean to call the 'sort' method on a 'Collection'对象失败,因为不存在这样的方法。”
  • 这行得通吗?如果您在原始对象中没有其他列表,它会起作用
  • 仍然无法正常工作,出现同样的错误
  • 我检查了一个列表,而不是检查列表的键,因为,你的评论提到,这个键可以改变。但是,如果您收到错误,如您的评论中所述,可以仅通过检查对象内的列表或通过循环对象的值来创建列表来提取列表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2019-09-14
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多