gpt4 book ai didi

c# - 如何从 C# 中具有重复元素名称的 Mongodb 读取数据

转载 作者:IT老高 更新时间:2023-10-28 13:32:30 30 4
gpt4 key购买 nike

我正在使用 MongoDB.Drivers在我的 C# MVC 应用程序中与 Mongodb 数据库进行通信。

C# 代码

            var client = new MongoClient("mongodb://localhost:27012");
var db = client.GetDatabase("Test_DB");
var collection = db.GetCollection<BsonDocument>("TestTable");
var tData = await collection.FindAsync(new BsonDocument(true)); // I used - new BsonDocument(true) to specify allow duplicate element name while read data.

MongoDB 数据图片 enter image description here

在上图中,您可以看到我有多个名为 DuplicateCol 的列具有不同的值(value)。当我试图在 c# 中读取这些数据时使用 MongoDB.Driver我收到以下错误:InvalidOperationException: Duplicate element name 'DuplicateCol'.

插入重复元素名称时我使用了AllowDuplicateNames=trueBsonDocument对象如下。 (它插入重复的元素名称没有错误。)

BsonDocument obj = new BsonDocument();
obj.AllowDuplicateNames = true;
obj.Add("DuplicateCol", "Value_One");
obj.Add("propone", "newVal");
obj.Add("DuplicateCol", "Value_Two");
.... // other properties with value
await collection.InsertOneAsync(obj);

注意:此架构是必须的。我不能改变它。

请为我提供解决此问题的建议。任何帮助将不胜感激..

谢谢。

最佳答案

如果没有其他帮助,您查看了其他答案和评论,并且仍然认为您绝对必须在问题中描述设计,您可以使用以下技巧。像这样创建类:

class AlwaysAllowDuplicateNamesBsonDocumentSerializer : BsonDocumentSerializer {
protected override BsonDocument DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args) {
if (!context.AllowDuplicateElementNames)
context = context.With(c => c.AllowDuplicateElementNames = true);
return base.DeserializeValue(context, args);
}

public override BsonDocument Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) {
if (!context.AllowDuplicateElementNames)
context = context.With(c => c.AllowDuplicateElementNames = true);
return base.Deserialize(context, args);
}
}

这是 BsonDocument 的自定义序列化程序,它在反序列化时始终设置 AllowDuplicateElementNames。然后你需要一些反射(reflection)来覆盖默认的 BsonDocument 序列化器(因为 BsonDocumentSerializer.Instance 没有 setter ):

// get __instance field, which is backing field for Instance property
var instanceField = typeof(BsonDocumentSerializer).GetField("__instance", BindingFlags.Static | BindingFlags.NonPublic);
// overwrite with our custom serializer
instanceField.SetValue(null, new AlwaysAllowDuplicateNamesBsonDocumentSerializer());

通过在启动时的某个地方执行此操作,您将能够读取具有重复属性的文档。

完整的测试代码:

static void Main(string[] args) {
var instanceField = typeof(BsonDocumentSerializer).GetField("__instance", BindingFlags.Static | BindingFlags.NonPublic);
instanceField.SetValue(null, new AlwaysAllowDuplicateNamesBsonDocumentSerializer());
TestMongoQuery();
Console.ReadKey();
}

static async void TestMongoQuery() {
var client = new MongoClient();
var db = client.GetDatabase("Test_DB");
var collection = db.GetCollection<BsonDocument>("TestTable");
using (var allDocs = await collection.FindAsync(FilterDefinition<BsonDocument>.Empty)) {
while (allDocs.MoveNext()) {
foreach (var doc in allDocs.Current) {
var duplicateElements = doc.Elements.Where(c => c.Name == "DuplicateCol");
foreach (var el in duplicateElements) {
Console.WriteLine(el.Name + ":" + el.Value);
}
}
}
}
}

关于c# - 如何从 C# 中具有重复元素名称的 Mongodb 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621780/

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