繁体   English   中英

如何删除GAE资讯提供中找不到的实体

[英]How to delete entities not found in feed on GAE

我正在一次更新Feed中的项目并将其添加到其中(一次可以有大约40000个项目)到数据存储200个项目,问题是Feed可以更改,并且某些项目可能会从Feed中删除。 我有以下代码:

class FeedEntry(db.Model):
    name = db.StringProperty(required=True)

def updateFeed(offset, number=200):
    response = fetchFeed(offset, number)
    feedItems = parseFeed(response)
    feedEntriesToAdd = []
    for item in feedItems:
        feedEntriesToAdd.append(
            FeedEntry(key_name=item.id, name=item.name)
        )
    db.put(feedEntriesToAdd)

如何找出资讯提供中没有的项目,并将其从资料储存库中删除? 我考虑过要创建一个项目列表(在数据存储区中),然后从那里删除所有我更新过的项目,剩下的就是要删除的项目。 -但这似乎很慢。

PS:所有item.id对于该Feed项目都是唯一的,并且是一致的。

如果添加带有auto_now=True的DateTimeProperty,它将记录每个实体的最后修改时间。 由于您更新了Feed中的每个项目,因此到您完成操作时,它们都会在您开始的那一刻起就有时间了,因此日期之前的所有内容都不再位于Feed中。

Xavier的世代计数器同样出色-我们所需要的只是保证在刷新之间增加,而在刷新期间绝不减少。

从文档中不确定,但是我希望DateTimeProperty大于IntegerProperty。 后者是64位整数,因此它们的大小可能相同,也可能是DateTimeProperty存储了几个整数。 一组帖子显示可能是10个字节而不是8个字节。

但是请记住,通过添加要查询的额外属性,无论如何都将添加另一个索引,因此字段大小的差异会被稀释为开销的一部分。 此外,即使按0.24美元/ G /月的价格,几个字节的40k倍也不算多。

无论是生成时间还是日期时间,您都不必立即删除数据。 您的其他查询可能会根据最新刷新的日期/生成进行过滤,这意味着您不必立即删除数据。 如果提要(或您对它的解析)变得很有趣并且无法产生任何项目,或者仅产生了一些项目,那么保留最后一次刷新作为备份可能很有用。 是否值得拥有完全取决于应用程序。

我会增加一个世代计数器

class FeedEntry(db.Model):
    name = db.StringProperty(required=True)
    generation = db.IntegerProperty(required=True)
def updateFeed(offset, generation, number=200):
    response = fetchFeed(offset, number)
    feedItems = parseFeed(response)
    feedEntriesToAdd = []
    for item in feedItems:
        feedEntriesToAdd.append(
            FeedEntry(key_name=item.id, name=item.name,generation=generation)
        )
    db.put(feedEntriesToAdd)
def deleteOld(generation):
    q = db.GqlQuery("SELECT * FROM FeedEntry " +
            "WHERE generation != :1" ,generation )
    db.delete(generation)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM