我有一个RavenDB查询,用于搜索文档中的活跃用户。
普通查询如下所示:
var documents = session.Query<Document>().Where(d => d.Users.Any(u => u.Id == UserId && u.Active == true)).ToList();
自动生成的查询如下所示:
from doc in docs.Documents
select new {
Users_Active = (
from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
select docUsersItem.Active).ToArray(),
Users_Id = (
from docUsersItem in ((IEnumerable<dynamic>)doc.Users).DefaultIfEmpty()
select docUsersItem.Id).ToArray()
}
但是,这会导致查询返回具有正确用户的文档,但该用户处于非活动状态,只要该文档上有另一个活动用户。
我怀疑这是因为字段被编入索引,结果如下:
AssignedUsers_Id: [1, 2]
AssignedUsers_Active:[false, true]
查询将匹配数组中的Id,并且在Active数组中为true,即使它们在各自的数组中处于不同的索引。
我需要对索引进行哪些更改才能使其仅返回UserId正确且处于活动状态的文档?
为了避免将来使用自动索引,有什么方法可以重写我的LINQ查询,以便它能正确索引和执行吗?
答案 0 :(得分:1)
这是自动索引的设计行为。您可以通过定义自己的索引来避免此行为,索引将在文档上为每个用户发出索引条目。
这是自动索引的默认行为的原因是,在绝大多数情况下,它对用户来说并不重要,但它在服务器端具有极高的潜在成本,因此我们希望用户做出明确的决定。