RavenDB在BulkInsertOperations之后获取文档计数

时间:2014-02-06 10:14:22

标签: ravendb bulkinsert

我正在使用RavenDB批量加载一些文档。有没有办法将文件数量加载到数据库中?

对于我正在进行的插入操作:

BulkInsertOperation _bulk = docStore.BulkInsert(null, 
             new BulkInsertOptions{ CheckForUpdates = true});

foreach(MyDocument myDoc in docCollection)
     _bulk.Store(myDoc);

_bulk.Dispose();

在那之后我打电话给以下人员:

session.Query<MyDocument>().Count();

但我总是得到一个小于我在乌鸦工作室看到的数字的数字。

1 个答案:

答案 0 :(得分:1)

默认情况下,您正在进行的查询限制了一些合理的结果,这是RavenDB默认安全的一部分,而不是流回数百万条记录。

为了获取yoru数据库中特定类型文档的编号,您需要一个特殊的map-reduce索引,其作用是跟踪每种文档类型的计数。由于这种类型的索引直接处理文档元数据,因此在Raven Studio中更容易定义它,而不是尝试使用代码创建它。

该索引的来源位于this question,但我会在此处复制:

// Index Name: Raven/DocumentCollections

// Map Query
from doc in docs
let Name = doc["@metadata"]["Raven-Entity-Name"]
where Name != null
select new { Name , Count = 1}

// Reduce Query
from result in results
group result by result.Name into g
select new { Name = g.Key, Count = g.Sum(x=>x.Count) }

然后要在代码中访问它,你需要一个类,它模仿Map和Reduce查询创建的匿名类型的结构:

public class Collection
{
    public string Name { get; set; }
    public int Count { get; set; }
}

然后,正如Ayende在previously linked question的答案中所说,你可以从索引得到这样的结果:

session.Query<Collection>("Raven/DocumentCollections")
       .Where(x => x.Name == "MyDocument")
       .FirstOrDefault();

但请记住,索引是异步更新的,所以在批量插入一堆文档后,索引可能是陈旧的。您可以在.Customize(x => x.WaitForNonStaleResults())之后添加.Query(...)强制它等待。

Raven Studio实际上从每个数据库存在的索引Raven/DocumentsByEntityName获取此数据,方法是回避正常查询并获取索引上的元数据。你可以这样仿效:

QueryResult result = docStore.DatabaseCommands.Query("Raven/DocumentsByEntityName",
    new Raven.Abstractions.Data.IndexQuery
    {
        Query = "Tag:MyDocument",
        PageSize = 0
    },
    includes: null,
    metadataOnly: true);

var totalDocsOfType = result.TotalResults;

QueryResult包含许多有用的数据:

{
    Results: [ ],
    Includes: [ ],
    IsStale: false,
    IndexTimestamp: "2013-11-08T15:51:25.6463491Z",
    TotalResults: 3,
    SkippedResults: 0,
    IndexName: "Raven/DocumentsByEntityName",
    IndexEtag: "01000000-0000-0040-0000-00000000000B",
    ResultEtag: "BA222B85-627A-FABE-DC7C-3CBC968124DE",
    Highlightings: { },
    NonAuthoritativeInformation: false,
    LastQueryTime: "2014-02-06T18:12:56.1990451Z",
    DurationMilliseconds: 1
}

如果您请求统计信息,那么很多都是您在任何查询中获得的相同数据,如下所示:

RavenQueryStatistics stats;

Session.Query<Course>()
    .Statistics(out stats)
    // Rest of query