gpt4 book ai didi

c# - 在 RavenDb 中映射减少 2 个带有子集合的集合

转载 作者:太空狗 更新时间:2023-10-29 21:23:50 27 4
gpt4 key购买 nike

我在 RavenDb 中存储了 2 种不同的对象类型,它们是父/子类型关系,在 JSON 中如下所示:

Account/1
{
"Name": "Acc1",
}

Items/1
{
"Account": "Account/1",
"Value" : "100",
"Tags": [
"tag1",
"tag2"]
}

Items/2
{
"Account": "Account/1",
"Value" : "50",
"Tags": [
"tag2"]
}

请注意,我不想将这些存储在同一个文档中,因为一个帐户可能有数千个项目。

我正在尝试编写一个 map/reduce 索引,它将返回如下内容:

{
"Account": "Acc1",
"TagInfo": [
{ "TagName" : "tag1",
"Count" : "1", //Count of all the "tag1" occurrences for acc1
"Value" : "100" //Sum of all the Values for acc1 which are tagged 'tag1'
},
{ "TagName" : "tag2",
"Count" : "2", //Two items are tagged "tag2"
"Value" : "150"
}]
}

即所有不同标签名称的列表以及每个标签的数量和它们的值。

我想我需要使用多重映射来将帐户和项目集合映射在一起,但我无法找出减少部分来创建结果的“TagInfo”部分。

这可能吗,还是我在 Raven 中的建模完全错误?

编辑:

我想从此查询中检索的类看起来像这样:

public class QueryResult
{
public string AccountId {get;set;}
public TagInfo Tags {get;set;}
}

public class TagInfo
{
public string TagName {get;set;}
public int Count {get;set;}
public int TotalSum {get;set;}
}

最佳答案

您不能为此使用 Multi Map/Reduce 索引,因为您希望一个映射在标签上,另一个在帐户上。它们没有共同的属性,因此您不能在此处使用多个 maps/reduce。

但是,您可以改用 TransformResult。方法如下:

public class Account
{
public string Id { get; set; }
public string Name { get; set; }
}

public class Item
{
public string Id { get; set; }
public string AccountId { get; set; }
public int Value { get; set; }
public List<string> Tags { get; set; }
}

public class TagsWithCountAndValues : AbstractIndexCreationTask<Item, TagsWithCountAndValues.ReduceResult>
{
public class ReduceResult
{
public string AccountId { get; set; }
public string AccountName { get; set; }
public string Tag { get; set; }
public int Count { get; set; }
public int TotalSum { get; set; }
}

public TagsWithCountAndValues()
{
Map = items => from item in items
from tag in item.Tags
select new
{
AccountId = item.AccountId,
Tag = tag,
Count = 1,
TotalSum = item.Value
};
Reduce = results => from result in results
group result by result.Tag
into g
select new
{
AccountId = g.Select(x => x.AccountId).FirstOrDefault(),
Tag = g.Key,
Count = g.Sum(x => x.Count),
TotalSum = g.Sum(x => x.TotalSum)
};
TransformResults = (database, results) => from result in results
let account = database.Load<Account>(result.AccountId)
select new
{
AccountId = result.AccountId,
AccountName = account.Name,
Tag = result.Tag,
Count = result.Count,
TotalSum = result.TotalSum
};
}
}

之后,您可以这样查询:

var results = session.Query<TagsWithCountAndValues.ReduceResult, TagsWithCountAndValues>()
.Where(x => x.AccountId == "accounts/1")
.ToList();

关于c# - 在 RavenDb 中映射减少 2 个带有子集合的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418778/

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