【问题标题】:How can I get all entity names (collection names) from a RavenDB database?如何从 RavenDB 数据库中获取所有实体名称(集合名称)?
【发布时间】:2012-12-27 02:29:24
【问题描述】:

我需要检索数据库中存在的所有 RavenDB 集合名称。有没有办法做到这一点?如何?

【问题讨论】:

  • 你在自己的 Lucas 上尝试过什么类型的网络搜索?
  • 这是一个好的开始 Lucas 开始阅读位于此处的文档Beginner's Guide to RavenDB
  • 我尝试使用 Map = docs => from doc in docs select new { Name = MetadataFor(doc).Value("Raven-Entity-Name") } 创建一个索引;我执行了一个 LINQ 搜索选择但没有工作:(我什至不知道这是否正确
  • 我理解您的沮丧,但没有任何示例问题本身说明您尝试过的内容以及您查看的位置,看起来就像您已经完成了一点也不努力。强调看起来。编辑您的问题,添加您所做工作的详细信息以使其更加完整。 =)
  • 不知道为什么这个问题被关闭了。这是其他人提出的问题,并且可能对许多其他人有用。

标签: c# collections metadata document ravendb


【解决方案1】:

如果您使用过该工作室,您会看到它创建了一个名为 Raven/DocumentsByEntityName 的索引。如果你不使用工作室,或者你想确保它在那里,你可以自己构建它:

documentStore.ExecuteIndex(new RavenDocumentsByEntityName());

Raven Studio 构建“集合”列表的方式是从该索引中获取Tag 字段的术语。你也可以这样做:

var results = documentStore.DatabaseCommands
                           .GetTerms("Raven/DocumentsByEntityName", "Tag", "", 1024);

(如果您出于某种原因期望超过 1024 种不同的实体类型,请分页。)

【讨论】:

  • 抱歉,我没能早点讲到这个。希望这会有所帮助!
  • 非常感谢您的回答!
【解决方案2】:

最后我通过尝试使用我之前获得的学习文档的知识得到了一个解决方案。我想给人们做个广告,我只有在我厌倦了试探性的时候才来这里。

public string[] getCollectionNames()
        {
            using (var session = this.store.OpenSession())
            {
                return session.Advanced.LuceneQuery<dynamic>()
                           .SelectFields<dynamic>("@metadata")
                           .Select<dynamic, string>(x => x["@metadata"]["Raven-Entity-Name"])
                           .Distinct()
                           .ToArray();

            }
        }

【讨论】:

  • 唯一的问题是Distinct 在客户端运行。所以你必须返回很多多余的数据才能得到你想要的结果。
  • Distinct 实际上运行服务器端。至少当您使用 Linq API 执行此操作时。使用 Lucene API,这确实是在客户端运行。但这行不通,另一种选择要好得多
  • 这行得通。正如你所说,只是这个选项并不好。但它有效,因为我测试过。我怎么知道 LuceneQuery Distinct 在客户端运行?这是在文档中吗?
猜你喜欢
  • 2021-05-27
  • 2017-07-23
  • 2016-01-19
  • 2011-01-18
相关资源
最近更新 更多