【问题标题】:Querying for RavenDB documents using multiple properties使用多个属性查询 RavenDB 文档
【发布时间】:2013-04-12 07:23:26
【问题描述】:

我需要对匹配多个属性的文档集合进行查询。
(来自邮件列表的交叉帖子:https://groups.google.com/forum/?fromgroups=#!topic/ravendb/r5f1zr2jd_o

这是文件:

public class SessionToken
{
    [JsonProperty("jti")]
    public string Id { get; set; }

    [JsonProperty("aud")]
    public Uri Audience { get; set; }

    [JsonProperty("sub")]
    public string Subject { get; set; }

    [JsonProperty("claims")]
    public Dictionary<string, string> Claims { get; set; }
}

这是测试:

[TestFixture] 
public class RavenDbTests 
{ 
    private IDocumentStore documentStore; 

    [SetUp]   
    public void SetUp() 
    { 
        this.documentStore = new EmbeddableDocumentStore() { RunInMemory = true }; 
        this.documentStore.Initialize(); 
    } 

    [Test] 
    public async void FirstOrDefault_WhenSessionTokenExists_ShouldReturnSessionToken() 
    { 
        var c = new SessionToken() 
                { 
                    Audience = new Uri("http://localhost"), 
                    Subject = "NUnit", 
                    Claims = new Dictionary<string, string>() 
                                { 
                                    { ClaimTypes.System, "NUnit" } 
                                } 
                }; 

        using (var session = this.documentStore.OpenAsyncSession())
        {
            await session.StoreAsync(c); 
            await session.SaveChangesAsync(); 

            // Check if the token exists in the database without using Where clause 
            var allTokens = await session.Query<SessionToken>().ToListAsync(); 
            Assert.That(allTokens.Any(x => x.Subject == "NUnit" && x.Audience == new Uri("http://localhost"))); 

            // Try getting token back with Where clause
            var token = await session.Query<SessionToken>().Customize(x => x.WaitForNonStaleResults()).Where(x => x.Subject == "NUnit" && x.Audience == new Uri("http://localhost")).ToListAsync(); 
            Assert.IsNotNullOrEmpty(token.First().Id); 
        } 
    } 
}

最后一个断言是失败的。 我必须承认我不确定这是我的错误还是失败。
据我了解,这应该可以工作。

PS。我尝试过使用独立的文档存储以及嵌入而不在内存中运行,但结果相同。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    你得到过时的结果。在单元测试中,您需要留出时间进行索引。

    .Customize(x=&gt; x.WaitForNonStaleResults()) 添加到您的查询中,测试应该会通过。

    另外,我认为您在剪切/粘贴时将Id 属性排除在您的问题之外,因为它不能按原样编译。

    更新

    根据 cmets 中的讨论,问题在于您将 [JsonProperty] 属性应用于 Id 属性。由于Id 属性代表文档键,并且不作为JSON 文档的一部分进行序列化,因此您不能对其应用[JsonProperty] 属性。

    【讨论】:

    • 今天试过了。结果还是一样。顺便提一句。更新了原始帖子以反映更改。
    • 你的测试通过了。完全一样。您使用的是什么版本/构建?
    • 好的。我在上面发布的SessionToken 类似乎不正确。当我在属性上有 JsonProperty 属性时,就会出现问题。我已经更新了帖子以反映这一点。
    • 您不能在Id 属性上使用[JsonProperty] 属性。
    • 我找不到任何明确说明的地方,但请理解 Id 属性(或任何遵循您的身份约定的属性)是文档键的表示,并且是 实际上并未存储在文档中。如果您查看 RavenDB 管理工作室中的一份文档,您可以看到这一点。所以不能通过json序列化属性来控制,因为它在序列化发生之前就被剥离掉了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多