gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:19:54 24 4
gpt4 key购买 nike

我需要恢复存储在 RavenDb 数据库中的 JSON,知道它的 Id .这里有什么棘手的,我需要在它反序列化为实际对象之前获取它。这样做的原因是,无论 CLR 类发生什么(它可以彻底改变甚至被删除),我都需要它以与它最初存储的完全相同的形式存在,因为它是对以前状态的审计(它只会是此时显示,我不会将其用于任何其他用途)。

如果我去

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

我得到反射(reflect)底层类型当前状态的 JSON,可能是因为它存储在 @metadata.Raven-Clr-Type 中.所以我没有看到已删除的属性,但确实看到了首次存储时不存在的空属性。

我想使用 DocumentStore.DatabaseCommands.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));
}
}

但是session.Load不接受 TIndexCreator ,并在 session.Query我无法获得 Id因为我没有可从中进行查询的对象的任何属性。


示例:

如果我有这个类:

public class Person
{
string FullName { get; set; }
int Age { get; set; }
}

然后我存储了一个新文档 new Person { FullName = "John Samson", Age = 42 } , 在 Idperson/A-1 , 然而半年后我决定将这个类修改为:

public class Person
{
string FirstName { get; set; }
string LastName { get; set; }
int Age { get; set; }
}

现在我想看看person/A-1的JSON是怎么来的看起来像,但尝试加载它会将其映射到当前状态 Person ,所以我会得到:

{
"FirstName": null,
"LastName": null,
"Age": 42
}

我想得到

{
"FullName": "John Samson",
"Age": 42
}

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

有人知道如何处理吗?只需向正确的方向提示,我们将不胜感激。

最佳答案

好吧,我终于找到了如何去做,所以我会把它留给那些出于某种原因想要这样做的人。

基本上,您只需创建一个 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;
}

关于c# - RavenDb 无需反序列化即可获取原始 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54286338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com