【问题标题】:RavenDb Stream returning no resultsRavenDb 流不返回任何结果
【发布时间】:2016-03-20 01:47:14
【问题描述】:

我是 RavenDb 的绝对初学者,但在使用 SQL 的 EF 和存储库模式方面非常有经验。终于开始尝试了,所以我使用 RavenDB.Embedded 创建了一个简单的控制台应用程序,目的是替换另一个应用程序上老化的 SQLLite EF 实现。

无论如何,我正在尝试将 1000 多条记录写入存储,然后简单地通过流读出。以下是部分示例代码:

var store = new EmbeddableDocumentStore
        {
            DataDirectory = "data"
        };
        store.Initialize();



        using (IDocumentSession session = store.OpenSession())
        {

            for (var t = 1; t < 1000; t++)
            {
                var subtest = new Test
                {
                    Id = new Guid(),
                    SubTest = new SubTest
                    {
                        Name = "NewTest",
                        Id = new Guid()
                    }
                };                    
                session.Store(subtest);
            }
            session.SaveChanges();
        }

        store
            .DatabaseCommands
            .PutIndex("SubTest/All",
                new IndexDefinitionBuilder<SubTest>()
                {
                    Map = tests => tests
                        .Select(test => new
                        {
                            SubTest = test.SubTest,
                            Id = test.Id
                        })
                });

        using (IDocumentSession session = store.OpenSession())
        {
            var query = session.Query<Test>("SubTest/All");

            var listt = query.ToList();

            using (var enumerator = session.Advanced.Stream(query))
            {
                while (enumerator.MoveNext())
                {
                    var t = enumerator.Current.Document;
                    System.Console.WriteLine(t.Id);
                }
            };
        }

        System.Console.ReadLine();

我意识到这是非常初级的,我并不想找人来纠正我的代码。只是希望有人可以帮助我理解索引事物应该如何与流一起工作,并可能解释为什么枚举器没有结果。如果我使用 .Load 而不是 .Query 我会得到结果(其中 128 个),所以我很确定其余的工作正常。

我尝试了上面的 PutIndex,但我也尝试了 AbstractIndexCreationTask,但结果同样令人困惑。我真的无法在网上找到很多关于这个的信息,很奇怪,这真的很罕见吗?

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    所以我终于想通了。似乎文档缺少有关 Streaming API 的一些关键细节。基本上我走在正确的轨道上,我只需要在代码的早期实际创建索引。我最终使用了 AbstractIndexCreationTask,我比 PutIndex 方法更喜欢它,尽管我不确定他们是否在做同样的事情。无论如何,这是可行的:

            var store = new EmbeddableDocumentStore
            {
                DataDirectory = "data"
            };
            store.Initialize();
    
            **IndexCreation.CreateIndexes(typeof(TestIndex).Assembly, store);**
    
            using (IDocumentSession session = store.OpenSession())
            {
    
                for (var t = 1; t < 100; t++)
                {
                    var subtest = new Test
                    {
                        Id = new Guid(),
                        SubTest = new SubTest
                        {
                            Name = "NewTest",
                            Id = new Guid()
                        }
                    };
                    session.Store(subtest);
                }
                session.SaveChanges();
            }
    
    
            using (IDocumentSession session = store.OpenSession())
            {
                IQueryable<Test> query = session.Query<Test, TestIndex>();
    
                var enumerator = session.Advanced.Stream(query);
    
                while (enumerator.MoveNext())
                {
                    var t = enumerator.Current.Document;
                    System.Console.WriteLine(t.Id);
                }
    
            }
    

    还有我的索引:

    public class TestIndex : AbstractIndexCreationTask<Test>
    {
        public TestIndex()
        {
            this.Map = tests =>
                from t in tests
                select new
                {
                    t.Id,
                    t.SubTest
                };
        }
    }    
    

    【讨论】:

    • 关于此示例的一个有趣的事情是,第一次运行时,流没有返回任何结果。根据我阅读的内容,这是因为我刚刚添加的数据还没有被索引,并且流不等待索引。
    • PutIndex 和创建 AbstractIndexCreationTask 做同样的事情:创建一个索引。我推荐后者。
    • 原始示例没有返回任何项目,因为它们还没有被索引。如果您等待索引过时(即完成索引),那么您将获得结果。 (基本上你已经遇到了 RavenDB 索引的最终一致性)。
    • 另外,LoadDocument 会绕过索引,因此无论索引状态如何,它都会检索文档
    • 你完全正确。我已经习惯了 SQL,这与我以前的习惯有点不同。但我喜欢它!我喜欢它的简单。它消除了我通常在 EF 之上编写的大量代码,使其更易于使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2017-12-09
    • 2020-10-03
    • 2017-03-19
    • 2017-05-20
    相关资源
    最近更新 更多