【问题标题】:query and project a nested array using the c# Mongodb driver使用 c# Mongodb 驱动程序查询和投影嵌套数组
【发布时间】:2020-08-08 15:40:57
【问题描述】:

您好,我正在尝试学习如何将 mongoDb 与 c# 驱动程序一起使用。我有一个类似这样的集合:

public class DataSnapshot
{

    [BsonId]
    public ObjectId InternalId { get; set; }
    public Int Id { get; set; }
    public string Identifier1 { get; set; }
    public string Identifier2 { get; set; }
    public List<NestedData> NestedData { get; set; }
}

public class NestedData
{

    public DateTime TimeStamp { get; set; }
    public double Info1 { get; set; }
    public double Info2 { get; set; }

}

嵌套数据可能非常大。

我想查询集合以返回一个日期范围内所有嵌套数据的列表(理想情况下将来自多个快照的数据连接在一起,但只有一个会是一个好的开始)

我正在努力弄清楚如何正确过滤和投影。我已经阅读了有关如何过滤以及如何过滤和投影的示例,但我正在努力使其适用于所有这些条件

我正在尝试做这样的事情:

context.DataSnapshot.Find(x => x.Identifier1 == "foo" && x.Identifier2 == "bar" && x.NestedData.Timestamp > DateTime.Now.AddYears(-1)).Project(x => x.NestedData).ToList();

最好的方法是什么?

谢谢

【问题讨论】:

    标签: c# mongodb mongodb-query nested-documents


    【解决方案1】:

    您可以使用 LINQ 查询:

    var q = from doc in col.AsQueryable()
            where doc.Identifier1 == "foo" && doc.Identifier2 == "bar"
            select doc.NestedData
            into nested
            from nestedDoc in nested
            where nestedDoc.TimeStamp > DateTime.Now.AddYears(-1)
            select nestedDoc;
    
    var results = q.ToList();
    

    它被翻译成以下 MongoDB 聚合:

    [
        { 
            "$match" : { 
                "Identifier1" : "foo", 
                "Identifier2" : "bar" 
                } 
            }, 
        { 
            "$project" : { 
                "NestedData" : "$NestedData", 
                "_id" : 0 
            } 
        }, 
        { 
            "$unwind" : "$NestedData" 
        }, 
        { 
            "$project" : { 
                "nested" : "$NestedData", 
                "nestedDoc" : "$NestedData", 
                "_id" : 0 
            } 
        }, 
        { 
            "$match" : { 
                "nestedDoc.TimeStamp" : { 
                    "$gt" : ISODate("2019-04-24T23:36:42.519Z") 
                } 
            } 
        }, 
        { 
            "$project" : { 
                "nestedDoc" : "$nestedDoc", 
                "_id" : 0 
            } 
        }
    ]
    

    因此整个过滤将在数据库中执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多