我正在使用 RavenDB 并允许用户将一个项目输入到数据库中,他们可以将文本标签与之关联。该项目的类是
public class TagItem
{
public string Id { get; set; }
public string UserId { get; set; }
public List<string> Tags { get; set;}
public DateTime DateCreated { get; set; }
}
}
我想做的是从文档查询中选择项目中的每个单独标签的实例计数。例如
Bacon : 12
Fudge : 8
Marshmallow : 6
我目前正在通过迭代项目并增加每个标签的计数来做到这一点,但这似乎不是一种非常优雅的获取结果的方式。我想知道是否有人对实现这一目标的更好方法提出建议?提前致谢。
-- 编辑#1 --
马特
我已尝试实施您对分面搜索的建议,但我似乎无法弄清楚如何使用用户 ID 的子集执行选择。我创建的索引如下
public class Tag_Facets : AbstractIndexCreationTask<UserModel>
{
public Tag_Facets()
{
Map = locations => from user in users
from tag in user.Tags
select new { Tag = tag.ToString().ToLower(), user.Id };
}
}
我有一个 UserId 列表,我想在针对它运行方面之前使用它来缩小此选择范围,但我尝试过的方法都不想编译。你能告诉我 Where 子句会是什么样子吗?
我的 FacetSetup 如下
this.DocumentSession.Store(new FacetSetup { Id = "facets/TagFacets", Facets = new
List<Facet> { new Facet { Name = "Tag" } } });
我正在尝试构建的查询是
var facetResults = this.DocumentSession.Query<LocationModel>("Tag/Facets")
.Where(x => x.Id.Contains(new List<string> { "1", "2", "3" }))
.ToFacets("facets/TagFacets");
这不会构建,因为 Contains 不接受 List
我希望你能指出我如何实现这一目标的正确方向。
另外,感谢您在 Faceted Search 方面所做的工作。这似乎是我正在寻找的执行大量我需要在 RavenDB 中运行的查询。干杯!
-- 编辑 #2 --
这是我用来实现我想要的结果的 SQL 表达式。
SELECT t.Tag, COUNT(*) FROM UserTags t WHERE t.UserID in ('1', '2', '3', '4', '5') GROUP BY t.Tag