Indexing ArangoDb上的数组索引
ArangoDb中的我的集合具有以下模式的对象(简化): 这是BorderEast在ArangoDb上的ASPNetCore.Identity实现 问题: 要使用Facebook进行身份验证,需要使用AQL查询Indexing ArangoDb上的数组索引,indexing,asp.net-identity,arangodb,Indexing,Asp.net Identity,Arangodb,ArangoDb中的我的集合具有以下模式的对象(简化): 这是BorderEast在ArangoDb上的ASPNetCore.Identity实现 问题: 要使用Facebook进行身份验证,需要使用AQL查询 for u in IdentityUser for l in u.logins filter l.loginProvider == "Facebook" && l.providerKey == "123" return u 它运行良好,但不使用任何索引 Indexes
for u in IdentityUser for l in u.logins filter l.loginProvider == "Facebook" && l.providerKey == "123" return u
它运行良好,但不使用任何索引
Indexes used:
none
我试过:
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].loginProvider", "logins[*].providerKey" ] });
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].loginProvider" ] });
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].providerKey" ], unique: true });
它们都没有被使用
有人能告诉我们该查询的索引应该是什么样子吗?问题在于他们的查询。它需要重新编写,然后才能工作。它与在比较运算符中使用
有关,如中所述:
“2.8中的查询仍然不会使用该索引,因为数组索引仅用于in比较运算符。”
因此,如果我们更改查询,将得到以下结果:
Query string:
for u in IdentityUser
let l = u.logins[*].loginProvider
let p = u.logins[*].providerKey
filter "google" in l and "googlekey" in p
return u
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
8 IndexNode 1 - FOR u IN IdentityUser /* persistent index scan */
9 CalculationNode 1 - LET #7 = ("googlekey" in u.`logins`[*].`providerKey`) /* simple expression */ /* collections used: u : IdentityUser */
6 FilterNode 1 - FILTER #7
7 ReturnNode 1 - RETURN u
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
8 persistent IdentityUser false false n/a [ `logins[*].loginProvider` ] ("google" in u.`logins`[*].`loginProvider`)
Optimization rules applied:
Id RuleName
1 move-calculations-up
2 remove-unnecessary-calculations
3 use-indexes
4 remove-filter-covered-by-index
@Ruslan,作为该报告的作者,我将更新代码并尽快推出一个新的nuget。推出新的nuget包以支持您的索引。在某个时候,我会将查询放在配置中,以简化此操作:)
Query string:
for u in IdentityUser
let l = u.logins[*].loginProvider
let p = u.logins[*].providerKey
filter "google" in l and "googlekey" in p
return u
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
8 IndexNode 1 - FOR u IN IdentityUser /* persistent index scan */
9 CalculationNode 1 - LET #7 = ("googlekey" in u.`logins`[*].`providerKey`) /* simple expression */ /* collections used: u : IdentityUser */
6 FilterNode 1 - FILTER #7
7 ReturnNode 1 - RETURN u
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
8 persistent IdentityUser false false n/a [ `logins[*].loginProvider` ] ("google" in u.`logins`[*].`loginProvider`)
Optimization rules applied:
Id RuleName
1 move-calculations-up
2 remove-unnecessary-calculations
3 use-indexes
4 remove-filter-covered-by-index