gpt4 book ai didi

nosql - 通过 RavenDB 中的多个值查询子集合

转载 作者:行者123 更新时间:2023-12-04 14:50:31 25 4
gpt4 key购买 nike

我正在使用 RavenDB build 371,我有以下模型:

class Product {
public string Id { get; set; }
public ProductSpec[] Specs { get; set; }
}

class ProductSpec {
public string Name { get; set; }
public string Value { get; set; }
}

我希望能够查询具有一组规范的产品。按单个规范查询时:
session.Query<Product>()
.Where(product => product.Specs.Any(spec => spec.Name == "Color" && spec.Value == "Red"))
.ToList();

返回预期结果,但是当添加额外的规范谓词时:
session.Query<Product>()
.Where(product => product.Specs.Any(spec => spec.Name == "Color" && spec.Value == "Red"))
.Where(product => product.Specs.Any(spec => spec.Name == "Country" && spec.Value == "US"))
.ToList();

即使第一个查询返回的结果包含规范名称为“Country”且规范值为“US”的产品,也不会返回任何结果。使用 LuceneQuery 方法时观察到相同的结果。这似乎是与 this discussion 类似的问题但是我无法实现建议的解决方案。具体来说,创建建议的索引后,我不知道如何查询它。

我如何在 RavenDB 中支持这种类型的查询?

编辑

我仍然无法查询复合类型集合上的多个值。相反,我更改了模型,以便规范/值组合是一个串联字符串,这样规范集合是一个字符串数组。这可以通过多个值进行查询:
class Product {
public string Id { get; set; }
public int CategoryId { get; set; }
public string[] Specs { get; set; }
}

作为引用,原始模型和查询在使用 MongoDB 时有效与他们的 multikeys索引功能。 MongoDB 非常令人惊讶的问题是 count() 操作是 slow for index queries .这种类型的查询对于分页是必不可少的,虽然计数可以被缓存,但我想要一个开箱即用的解决方案。此外,我的另一个要求是能够为任意产品集合聚合规范组(例如,获取给定类别中产品的所有规范/值组合的集合)。在 MongoDB 中,这可以使用其 MapReduce 功能来实现,但是 MapReduce 操作的结果是静态的,必须在源数据更改时手动更新,而 RavenDB 在后台自动更新 MapReduce 索引。因此,尽管在 RavenDB 中声明 MapReduce 索引比在 MongoDB IMO 中更麻烦,但自动后台更新远胜于缺点。我会看 CouchDB因为它们的 View 也会自动更新,尽管它们似乎是按需更新的,而不是在后台自动更新,不确定这是否会成为问题。

最佳答案

我尝试了不同的东西,也无法让它工作。您尝试执行的特定查询由 RavenDB 解析为这个 Lucene 查询(版本 426):

“{(Name:Color AND Value:Red) AND (Name:Country AND Value:US)}”解释了为什么你没有得到结果。

在谷歌搜索这个主题后,我找到了这篇文章:Lucene Query Syntax

答案中建议了不同的解决方法。希望这会有所帮助。不过,我自己比较好奇,如果这真的不可能的话。

关于nosql - 通过 RavenDB 中的多个值查询子集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099079/

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