【问题标题】:Querying ravendb index using named field and collection使用命名字段和集合查询 ravendb 索引
【发布时间】:2017-05-10 08:14:26
【问题描述】:

我在 ravendb 中有以下索引,Changes_Which 是一个命名字段,它映射到一个子集合

    public My_Index()
    {
        Map = revisions => from revision in revisions
                           from change in revision.Changes
                           where (revision.AuditedType == "typeA")
                       select
                        new
                        {
                            revision.ChangeTimestamp,
                            Changes_Which = change.Which
                        };

    }

修订版的 json 格式如下:

{
"AuditedType" : "typeA",
"Changes": [
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Other",
"Original": "Unknown",
"New": "Yes"
},
{
"SubWhich": null,
"Which": "Regulation",
"Original": "Unknown",
"New": "Yes"
}
]
"ChangeTimestamp": "2011-05-03"
}

我正在尝试使用 Changes_Which 字段过滤索引中的结果:

        var q = session.Advanced.LuceneQuery<revision>("My_Index/Index")
            .WaitForNonStaleResultsAsOfLastWrite()
            .AddOrder(paging.SortColumn, paging.SortOrder == "desc")
            .Skip(((paging.CurrentPage - 1) * paging.RecordsPerPage))
            .Take(paging.RecordsPerPage);

        if (fromDate > DateTime.MinValue && toDate > DateTime.MinValue)
        {
            q = q.WhereGreaterThanOrEqual("ChangeTimestamp", fromDate)
                .AndAlso()
                .WhereLessThanOrEqual("ChangeTimestamp", toDate.AddDays(1).AddMinutes(-1));
        }

        if (removeNoChange)
        {
            q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");  
        }

这一行:

q = q.AndAlso().Not.WhereEquals("Changes_Which", "Regulation");

确实有效,但只删除了“Which”上的第一个匹配项:“Regulation”,集合中的第三个匹配项仍然存在。

任何建议表示赞赏。

【问题讨论】:

    标签: lucene ravendb


    【解决方案1】:

    这样做的原因是您正在为同一文档输出不同的索引条目。 在 RavenDB 中搜索时,您正在搜索文档,在您的情况下,您过滤掉了该文档上的第一个索引条目,但还有其他匹配的索引条目,因此它被返回。

    你可能会更好:

     Map = revisions => from revision in revisions
                        where (revision.AuditedType == "typeA")
                        select
                        new
                        {
                            revision.ChangeTimestamp,
                            Changes_Which = revision.Changes.Select(chnage => change.Which)
                        };
    

    这将只为每个文档输出一个条目(推荐),并将过滤所有因Regulation而更改的文档

    【讨论】:

      猜你喜欢
      • 2016-05-21
      • 2011-11-16
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多