MongoDB C# driver - Abfrage einer Eigenschaft auf ein array von Filialdokumenten
Angenommen ich habe folgende Struktur der Dokumente in MongoDB.
{
_id: ####,
Ancestors: [
{ _id: 1, Name: "asdf" },
{ _id: 2, Name: "jkl;" },
...
]
}
Möchte ich finden Sie jedes Dokument enthält einen Ahnen, wo _id an die Ahnen, 2.
Kann ich diese Abfrage ausführen, die in der mongo-shell über diese: db.projects.find({"Ancestors._id": 2})
Kann ich auch ausführen dieser Abfrage mit der offiziellen C - # - Treiber mit diesem: Query.EQ("Ancestors._id", new BsonInt32(rootProjectId))
.
Hier sind meine POCOs; die eigentlichen Klassen, die ich verwende haben mehr Eigenschaften als diese, aber ich wollte nicht zu überhäufen, die die Frage mit unnötigen details:
public class Project
{
public int Id { get; set; }
public List<ProjectRef> Ancestors { get; set; }
}
public class ProjectRef
{
public int Id { get; set; }
public string Name { get; set; }
}
Meine Frage ist: Wie kann ich Schreibe eine stark typisierte Abfrage, die mit der C# - Treiber so, dass ich mich nicht übergeben "Vorfahren._id" als string? Ich möchte in der Lage sein, etwas zu tun, wie Query<Project>.EQ(p => p.Id, rootProjectId)
so dass ich stattdessen ein Mitglied Ausdruck und lassen Sie die Klasse Zuordnungen sagen Sie dem Fahrer, dass Sie es verwenden sollten "Vorfahren._id".
Du musst angemeldet sein, um einen Kommentar abzugeben.
ElemMatch ist dein Freund in diesem Fall.
versuchen Sie Folgendes:
verwenden finalQuery in einem Suchen-Befehl auf die Projekte-Sammlung.
Query<>.ElemMatch()
eingegeben wird, das durch den ersten parameter, so dass, wenn Sie schreiben wollen, die gesamte Abfrage als eine einzige Anweisung, die Sie tun können:var finalQuery = Query<Project>.ElemMatch(p => p.Ancestors, builder => builder.EQ(pr => pr.Id, rootProjectId));
und speichern Sie ein paar Tastenanschläge.