如何从MongoDB文档中字典中的对象中检索属性

本文关键字:对象 检索 属性 字典 MongoDB 文档 | 更新日期: 2023-09-27 18:34:13

我们的 Mongo 数据如下所示:

{
        "_id" : ObjectId("542d881b8bc641bbee1f8509"),
        "ExtendedProperties" : {
                "Context" : {
                        "_t" : "LoggingContext",
                        "DeclaringTypeName" : "EndpointConfig"
                }
        }
}

在 C# 代码中,扩展属性表示如下:

public class LogEntry
{
    public IDictionary<string, object> ExtendedProperties { get; set; }
}

我已经尝试了我能找到的所有方法,以便能够查询声明类型名称的值。似乎没有任何效果,如以下代码所示:

// This throws an UnsupportedOperationException with the following message:
// Unable to determine the serialization information for the expression: (LogEntry e) => e.ExtendedProperties.get_Item("DeclaringTypeName").ToString().
query.Add(Query<LogEntry>.EQ(e => ((LoggingContext)e.ExtendedProperties["Context"]), this.DeclaringTypeName ));
// This returns zero matching rows:
query.Add(Query.EQ("ExtendedProperties.Context.DeclaringTypeName", this.DeclaringTypeName));
// This returns zero matching rows:
query.Add(Query.ElemMatch("ExtendedProperties.Context", Query.EQ("DeclaringTypeName", this.DeclaringTypeName)));
// This reports that ExtendedProperties must implement a specific interface and must not return null:
query.Add(Query<LogEntry>.ElemMatch(e => e.ExtendedProperties, qb => Query.EQ("Context.DeclaringTypeName", this.DeclaringTypeName)));

为了清楚起见,我已经研究了我能找到的每个 StackOverflow、CodePlex 和 Mongo.org 线程,但到目前为止还无法正确解决这个问题。

当然,这将是我做错的事情。

有人请扔给我一根骨头。

如何从MongoDB文档中字典中的对象中检索属性

我将 LogEntry 类定义为

public class LogEntry
{
    public ObjectId Id { get; set; }
    public IDictionary<string, object> ExtendedProperties { get; set; }
}

然后我插入了示例文档

var log = new LogEntry
{
    ExtendedProperties = new Dictionary<string, object>
    {
        {
            "Context", new LoggingContext
            {
                DeclaringTypeName = "EndpointConfig"
            }
        }
    }
};
collection.Insert(log);

然后我通过以下方式执行查询:

var rawQuery = Query.EQ("ExtendedProperties.Context.DeclaringTypeName", "EndpointConfig");
var query = new List<IMongoQuery>();
query.Add(rawQuery);
var rawResult = collection.Find(rawQuery).ToList();

查询将在查询下方发送 MONGO

db.messages.find({ "ExtendedProperties.Context.DeclaringTypeName" : "EndpointConfig" })

我得到了结果