gpt4 book ai didi

c# - RavenDB SelectMany 替代方案

转载 作者:行者123 更新时间:2023-12-02 05:18:39 26 4
gpt4 key购买 nike

我正在使用 Nancy 和 RavenDB 构建一个照片库我的模型类如下:

[JsonObject(IsReference=true)]
public class Album
{
public Album()
{
this.Photos = new List<Photo>();
this.Tags = new List<String>();
}

public String Id {get; set;}
public String Name {get; set;}
public String Path {get; set;}
public DateTime ModifiedDate{get; set;}
public IList<String> Tags {get; set;}
public IList<Photo> Photos {get; set;}

}

public class Photo
{
public String Id {get; set;}
public String Name {get; set;}
public String Path {get; set;}
public IList<String> Tags {get; set;}
public Album Album {get; set;}
public DateTime ModifiedDate{get; set;}
public bool IsPrivate{get; set;}
}

我尝试在 Photo->Tags 上减少 map 索引:

   public class TaggedPhotosIndex:AbstractIndexCreationTask<Album, TaggedPhotos>
{
public TaggedPhotosIndex()
{
Map = albums =>
from a in albums
from p in a.Photos
from t in p.Tags
select new TaggedPhotos
{
Tag = t,
PhotoIds = new List<String> {p.Id}
};
Reduce = results =>
from result in results
group result by result.Tag into agg
select new TaggedPhotos
{
Tag = agg.Key,
PhotoIds = agg.SelectMany(a => a.PhotoIds).ToList()
};
}
}

public class TaggedPhotos
{
public String Tag {get; set;}
public IList<String> PhotoIds {get; set;}
}

这是我想要实现的:

给定一组标签,我想获取所有具有至少一个匹配标签的照片对象。

RavenDB 不允许在查询中使用 SelectMany 并且没有想法。

找到了解决方案(使用 LuceneQuery @ Workaround for selectmany in ravendb using client api),但期待任何其他替代方案。

最佳答案

您的文档结构存在一些问题,这将使您的查询变得困难。

  • 查询设计以返回整个文档。您要求从文档中获得部分结果。这是可以做到的,但前提是您将所有字段存储在索引中并从那里投影结果。您放弃了文档存储的 ACID 保证,这是 RavenDB 最强大的功能之一。

  • 您有一个从 Photo 返回到 Album 的引用,这通常会被嵌入,导致循环引用,除非您正在设置 [JsonObject( IsReference=true)] 来避免这种情况。这可能适用于单个文档中的基本序列化,但在从投影索引值引用整个文档时毫无意义。您已经设置了自己的“先有鸡还是先有蛋”问题。

  • 您仍然缺少人们期望从这个问题领域获得的基本功能。具体来说,您应该能够加载单张照片而无需加载整个相册。

强烈建议您将照片放在自己的文档中。然后你可以有更简单的索引并避免循环引用。在 DDD术语,PhotoAlbum 都是聚合。一个 DDD 聚合 == 一个 RavenDB 文档。您当前正在将照片建模为非聚合的实体,但随后您要求执行只能针对聚合执行的操作 - 例如搜索。

如果您只是问“给我所有包含带有这些标签之一的照片的相册”,那么您就可以了。但您不是要相册,而是要照片

假设您确实以这种方式建模,Brett 的答案很接近 - 但有一些无关的东西。这是一个显示完整实现的单元测试。发布要点,因为它没有直接解决原始问题。 https://gist.github.com/4499724

关于c# - RavenDB SelectMany 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com