在MongoDB中存储动态JSON数据

4

我的客户端服务生成了一个数据集,其中包括一个 dynamic 字段。这是一个带有非结构化数据的匿名对象。我需要通过 POST 请求将其传输到我的存储服务。

现在我想以接收到的相同方式存储数据,但问题是我的存储服务将其解析为 JObject,在存储到 MongoDB 中会产生奇怪的数据。在 MongoDB Compass 中,我无法再看到数据集的值。

当前发送以下测试数据:

{
    "sessionId" : "202C25C1-DE25-499B-B4F1-1D46FA169A02",
    "timestamp" : "5/6/2005 09:34:42 PM",
    "type" : "request",
    "data" : {
        "testField1" : 120,
        "testField2" : "Test Value",
        "testField3" : [ "value1", "value2" ]
    }
}

下面是我从MongoDB获取的内容:

{
    "_id": {
        "$oid": "6076bceebc1aec06799826dd"
    },
    "SessionId": {
        "$binary": "wSUsICXem0m08R1G+haaAg==",
        "$type": "3"
    },
    "Timestamp": {
        "$date": "2005-05-06T19:34:42.000Z"
    },
    "Type": 0,
    "Data": {
        "_t": "Newtonsoft.Json.Linq.JObject, Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed",
        "_v": {
            "testField1": {
                "_t": "JValue",
                "_v": []
            },
            "testField2": {
                "_t": "JValue",
                "_v": []
            },
            "testField3": {
                "_t": "JArray",
                "_v": [
                    {
                        "_t": "JValue",
                        "_v": []
                    },
                    {
                        "_t": "JValue",
                        "_v": []
                    }
                ]
            }
        }
    }
}

编辑:此外,将这些数据存储会导致在尝试从数据库检索数据时出现异常。 MongoDB无法反序列化JToken对象,因为它无法访问某些方法/构造函数。

这几乎是垃圾。我尝试将JSON作为字符串存储,但是MongoDB不会将其存储为实际的JSON对象,而是将其存储为实际字符串,因此破坏了基于文档的存储的意图:

{
    "_id": {
        "$oid": "6076bc8fbc1aec06799826a5"
    },
    "SessionId": {
        "$binary": "wSUsICXem0m08R1G+haaAg==",
        "$type": "3"
    },
    "Timestamp": {
        "$date": "2005-05-06T19:34:42.000Z"
    },
    "Type": 0,
    "Data": "{\"testField1\":120,\"testField2\":\"Test Value\",\"testField3\":[\"value1\",\"value2\"]}"
}

有没有解决方案能让我以同样的方式存储动态对象?我不能简单地将它反序列化成 dynamic 对象,因为这将导致一个 JObject,因为它实际上是从动态接口派生出来的。但正如所说的,MongoDB 无法正确处理这些对象。


您可以在C#中将数据类型定义为JObject(Newtonsoft)或JElement(System.Text.Json),并准备这些值。它们应该按照您的期望保存在Mongo中。 - jalepi
好的,谢谢。我一段时间前解决了这个问题,方法是将整个JSON数据存储在字符串属性中,然后调用var doc = BsonSerializer.Deserialize<TransactionItem>(request.Data);进行实际存储之前的反序列化。MongoDB的BsonSerializer类可以很好地处理这个问题。只需要使用自定义的InputFormatter,将输入数据反序列化并将同样的JSON字符串设置为生成的命令对象的属性即可。有点不太好看,但这是我能找到的唯一有效的解决方案。 - SharpShade
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接