0

我有一些属性,比如说

color = blue
age = 22
name = Tom

在数据存储中的许多实体中,我怎样才能获得与大多数属性匹配的实体?我当然可以:

query.filter('color =', 'blue')
query.filter('age =', '22')
query.filter('name =', 'Tom')

但是,如果不存在具有确切属性的此类实体,则它不会给出结果。如何获得至少两个过滤器匹配的实体,或者如果仍然不起作用,一个过滤器..?它不需要计算值或其他东西的相似性,只需给我大多数过滤器尽可能匹配的实体。

4

1 回答 1

2

您基本上要求的是 OR 运算符,这对于单个查询是不可能的。我认为你有两个选择:

1) 通过子类化 MultiQuery 添加 OR 运算符。这仍然会在后台执行几个查询,并且排序和游标将不起作用。

2) 预先计算你的三个属性的所有可能组合,将它们放入一个StringListProperty,然后使用IN 运算符。例如,您的模型如下所示:

m.col_age_name = ['c:blue, a:22', 'c:blue, n:Tom', \
                  'a:22, n:Tom', 'a:22, c:blue, n:Tom']

然后运行过滤器:

q.filter('col_age_name IN', ['c:blue, a:22', 'c:blue, n:Tom', 'a:22, n:Tom'])

该解决方案存在问题:(a) 它在后台执行多个查询,(b) 您需要运行 3 次(1、2 和 3 属性一次),(c) 它不支持顺序或游标, (d) 它使管理数据变得一团糟。唯一的好处是它将您需要进行的过滤器调用的最大数量从 7 个减少到 3 个。

这显然比它的价值更麻烦。我将只运行简单查询七次,它有缺点(a)和(c)但没有(d)。

于 2011-01-11T22:28:35.990 回答