RavenDb无需反序列化即可获取原始JSON

Ari*_*ion 5 c# ravendb

我需要恢复存储在RavenDb数据库中的JSON,知道它是Id。棘手的是,在将其反序列化为实际对象之前,我需要获取它。这样做的原因是,无论CLR类发生了什么(它可能会发生很大的变化,甚至被删除),我都需要使用与它最初存储时完全相同的形式,因为它是对先前状态的审核(这只会是此时显示的内容,我将不再使用它)。

如果我去

using (var session = Store.OpenSession())
{
    return JsonConvert.SerializeObject(session.Load<object>(id));
}
Run Code Online (Sandbox Code Playgroud)

我得到反映基础类型当前状态的JSON,可能是因为它存储在中@metadata.Raven-Clr-Type。因此,我看不到已删除的属性,也看到了首次存储时不存在的空属性。

我想使用DocumentStore.DatabaseCommands.Get()get RavenJObject,但是为了支持它已经在4.1中删除了Advanced.DocumentQuery,我找不到找到使用它的方法。

我也试过AbstractIndexCreationTask像这样使用自己的:

class Object_AsJson : AbstractIndexCreationTask<JsonObject>
{
    public Configuration_AsJson()
    {
        Map = configuration => configuration.Select(x => AsJson(x).Select(y => y.Value));
    }
}
Run Code Online (Sandbox Code Playgroud)

session.Load不接受TIndexCreator,和session.Query我不能得到Id,因为我没有对象,从使查询的任何属性。


例:

如果我有这堂课:

public class Person
{
    string FullName { get; set; }
    int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将新文档存储new Person { FullName = "John Samson", Age = 42 }在下Id person/A-1,但是半年后,我决定将此类修改为:

public class Person
{
    string FirstName { get; set; }
    string LastName { get; set; }
    int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想看看的JSON的person/A-1样子,但是尝试加载它将其映射到的当前状态Person,因此我将得到:

{
  "FirstName": null,
  "LastName": null,
  "Age": 42
}
Run Code Online (Sandbox Code Playgroud)

我想得到

{
  "FullName": "John Samson",
  "Age": 42
}
Run Code Online (Sandbox Code Playgroud)

我可以在RavenDb Studio GUI中看到所需的结果,但是我需要在代码中获取它才能在应用程序中显示它。

有谁知道如何处理吗?朝正确方向的提示将不胜感激。

Ari*_*ion 6

好的,所以我终于找到了如何去做,所以我会把它留在这里给出于某种原因想要做同样事情的人。

基本上你只需要创建一个实例GetDocumentsCommand并执行它。就我而言,它看起来像这样:

using (var session = Store.OpenSession(database))
{
    var command = new GetDocumentsCommand(id, null, false);
    session.Advanced.RequestExecutor.Execute(command, session.Advanced.Context);
    var result = command.Result.Results.FirstOrDefault();
    var json = result?.ToString(); // At this point you already have your JSON
    var jObject = JObject.Parse(json);
    jObject.Remove("@metadata"); // If you don't want metadata in your JSON
    jObject.Add("Id", id); // Because Id does not appear to be part of JSON
    return jObject;
}
Run Code Online (Sandbox Code Playgroud)