簡體   English   中英

RavenDb在沒有反序列化的情況下獲得原始JSON

[英]RavenDb get raw JSON without deserialization

知道它的Id我需要恢復存儲在RavenDb數據庫中的JSON。 這里有什么棘手的問題,我需要在它被反序列化為實際對象之前得到它。 原因是,我需要它與第一次存儲的形式完全相同,無論CLR類發生了什么(它可以徹底改變甚至被刪除),因為它是對先前狀態的審計(它只會是在這一點上顯示,我不會用它來做任何事情)。

如果我去

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

我得到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; }
}

我在Id person/A-1下存儲了一個新文檔new Person { FullName = "John Samson", Age = 42 } ,但半年后我決定將此類修改為:

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;
}

來自https://github.com/ravendb/book/blob/v4.0/Ch03/Ch03.md#revisions-and-auditing

“...... 審計有點不同。雖然修訂告訴你改變了什么,審計會告訴你由誰和通常是什么.RavenDB使用客戶端偵聽器支持這種審計,這可以為文檔提供額外的上下文。改變了......“

了解如何使用事件處理程序實現審計機制https//github.com/ravendb/book/blob/v4.0/Ch04/Ch04.md#event-handlers
https://ravendb.net/docs/article-page/4.1/Csharp/migration/client-api/document-store#listeners

使用類似的東西:

store.OnBeforeStore += (sender, args) =>
{
args.DocumentMetadata["Modified-By"] =
RequestContext.Principal.Identity.GetUserId();
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM