1

我正在存储文档——每个文档都有一个“标签”集合——就像这样。标签是用户定义的,可以是任何纯文本。

{
  "FeedOwner": "4ca44f7d-b3e0-4831-b0c7-59fd9e5bd30d",
  "MessageBody": "blablabla",
  "Labels": [
    {
      "IsUser": false,
      "Text": "Mine"
    },
    {
      "IsUser": false,
      "Text": "Incomplete"
    }
  ],
  "CreationDate": "2012-04-30T15:35:20.8588704"
}

我需要允许用户查询标签的任何组合,即

"Mine" OR "Incomplete"
"Incomplete" only
or
"Mine" AND NOT "Incomplete"

这会导致像这样的 Raven 查询:

Query: (FeedOwner:25eb541c\-b04a\-4f08\-b468\-65714f259ac2) AND (Labels,
Text:Mine) AND (Labels,Text:Incomplete)

我意识到 Raven 将为它以前从未见过的查询生成一个“动态索引”。我可以看到,这可能会导致很多索引。

使用 Raven 实现此功能的最佳方法是什么?

[编辑]

这是我的 Linq,但我从 Raven 收到错误“不支持所有内容”

var result = from candidateAnnouncement in session.Query<FeedAnnouncement>()
where listOfRequiredLabels.All(
    requiredLabel => candidateAnnouncement.Labels.Any(
        candidateLabel => candidateLabel.Text == requiredLabel))
select candidateAnnouncement;

[编辑]

我有一个类似的问题,答案解决了这两个问题:Raven query returns 0 results for collection contains

4

1 回答 1

0

请注意,如果FeedOwner作为文档的唯一属性,查询根本没有多大意义。在这种情况下,您应该使用标准 linq to objects 在客户端上执行此操作。

现在,鉴于这FeedOwner不是独一无二的,您的查询基本上是正确的。但是,根据您实际想要返回的内容,您可能需要创建一个静态索引:

如果您使用动态生成的索引,那么您将始终将文档作为返回值,并且您无法获得与查询匹配的特定标签。如果这对您来说没问题,那么只需采用该方法并让查询优化器完成其工作(仅当您确实有很多文档预先构建索引时)。

在另一种情况下,您想使用实际标签作为查询结果,您必须预先构建一个简单的地图索引,该索引涵盖您要查询的字段,在您的示例中,这将是 FeedOwner 和每个标签的文本。您必须在要从查询中返回的字段上使用 FieldStorage.Yes,因此请在标签的 Text 属性上启用它。但是,FeedOwner 属性不需要这样做,因为它是实际文档的一部分,raven 会在任何查询结果中为您提供。请参阅 raven 文档以了解如何构建静态索引和使用字段存储。

于 2012-04-30T07:32:42.660 回答