запросить и спроецировать вложенный массив с помощью драйвера c# Mongodb - PullRequest
1 голос
/ 25 апреля 2020

Привет. Я пытаюсь узнать, как использовать 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();

Как лучше всего это сделать?

Спасибо

1 Ответ

2 голосов
/ 25 апреля 2020

Вы можете использовать запрос 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 
        } 
    }
]

Таким образом, вся фильтрация будет выполняться в базе данных.

...