3

嗨,我正在尝试学习如何将 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();

最好的方法是如何做到这一点?

谢谢

4

1 回答 1

3

您可以使用 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 
        } 
    }
]

所以整个过滤将在数据库中执行。

于 2020-04-24T23:40:39.200 回答