我正在使用RavenDB批量加载一些文档。有没有办法将文件数量加载到数据库中?
对于我正在进行的插入操作:
BulkInsertOperation _bulk = docStore.BulkInsert(null,
new BulkInsertOptions{ CheckForUpdates = true});
foreach(MyDocument myDoc in docCollection)
_bulk.Store(myDoc);
_bulk.Dispose();
在那之后我打电话给以下人员:
session.Query<MyDocument>().Count();
但我总是得到一个小于我在乌鸦工作室看到的数字的数字。
答案 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