在应用引擎数据存储区中查找重复项

ana*_*ana 7 database google-app-engine duplicates

我在App Engine中的数据存储区中有一些重复的元素(不是整行,而是大多数字段).

找到它们的最佳方法是什么?

我有重复的整数和字符串字段(如果比较一个比另一个快).

谢谢!

Ami*_*mir 6

一个愚蠢但快速的方法是采用你关心的字段,将它们连接成一个长字符串,并将它们存储为DB_Unique引用原始实体的实体的键.每次执行此操作时DB_Unique.get_or_insert(),应验证引用是否为正确的原始实体,否则,您将复制.这应该可以在map reduce中完成.

就像是:

class DB_Unique(db.Model):
  r = db.ReferenceProperty()

class DB_Obj(db.Model):
  a = db.IntegerProperty()
  b = db.StringProperty()
  c = db.StringProperty()

# executed for each DB_Obj...
def mapreduce(entity):
  key = '%s_%s_%s' % (entity.a,entity.b,entity.c)
  res = DB_Unique.get_or_insert(key, r=entity)
  if DB_Unique.r.get_value_for_datastore(res) != entity.key():
    # we have a possible collision, verify and delete?
    # out two entities are res and entity
Run Code Online (Sandbox Code Playgroud)

有几个边缘情况可能会爬升,例如,如果你有两个实体,b和c分别等于('a_b','')和('a','b_'),那么连接是' a_b_'为两者.所以使用你知道的字符不是在你的字符串而不是'_',或者DB_Unique.r是一个引用列表并比较所有这些字符.