【问题标题】:Indexed DB - compound index query where one or the other matches索引数据库 - 一个或另一个匹配的复合索引查询
【发布时间】:2014-05-05 02:35:45
【问题描述】:

如果我的术语不正确或没有得到很好的解释,我们深表歉意。不久前,我使用 websql 数据库创建了一些东西,并想尝试将其更改为索引数据库。

我已经创建了这个索引,它可以让我找到主队是特定值而客队是特定值的对象:

objectStore.createIndex("homeAway", ["hometeam", "awayteam"], {unique: false});

因此,如果我正在寻找美国(主队)和俄罗斯(客队)之间的比赛,我会得到我想要的:

var range = IDBKeyRange.only([hometeam, awayteam]);
var index = objectStore.index("homeAway");

但是,如果我想使用这种 .only 方法来查找某支球队在主场或客场比赛的比赛,该怎么办。像这样的:

var range = IDBKeyRange.only([hometeam || awayteam]);

如果我以家乡和家乡的身份进入俄罗斯,它会找到他们的家乡或家乡。这可能吗?

【问题讨论】:

  • 理论上,我认为这是一个不好的建议,所以我不会将其作为答案发布,您可以只进行 2 次搜索并使用 promises 来了解两者何时完成,这样您就可以结合结果。或者见鬼,既然只有两个,就一个接一个地做,并遭受一点回调地狱。

标签: indexeddb


【解决方案1】:

不可能同时在两个字段上打开和索引,但是有一个适合您的情况的索引解决方案。

您需要为将包含两个团队的数组字段创建一个新索引,并将multiEntry 属性设置为true

objectStore.createIndex("teams", ["teams"], {unique: false, multiEntry: true});

然后将两个团队作为字符串数组存储到该字段中

var obj = {
    hometeam: "Russia",
    awayteam: "Usa",
    teams: ["Russia", "Usa"]
}

现在,当您在该字段上查询数据库时,您应该会得到 Russia 正在玩的所有游戏:

var index = objectStore.index("teams");
var keyRange = IDBKeyRange.only("Russia");
var cursorRequest = index.openCursor(keyRange);

【讨论】:

  • 呃。当然,这就像在内容中添加“标记”并搜索标记一样。我以前实际上已经这样做过,我什至没有想到。 :)
  • 可以同时在两个字段上打开索引。否则这是一个很好的答案。
  • 是的,您可以创建复合索引,但对于这种情况,索引将没有用处。
猜你喜欢
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多