C#-MongoDB-Treiber – Dokumente finden, deren Inhalt irgendwo einen Wert aufweist
Posted: 06 Jan 2025, 22:14
Ich habe eine in C# geschriebene ASP.NET Core 9.0-Web-API, die eine MongoDB mithilfe des MongoDB-Treibers (3.1) abfragt. Die MongoDB verfügt über eine Sammlung namens Foo und soll Daten aus verschiedenen Quellen enthalten.
Sie hat das folgende Schema:
Das Inhaltsfeld hat selten die gleiche Datenstruktur für zwei beliebige Dokumente, z. B.
Die Benutzeranforderung ist die Fähigkeit, alle Dokumente zu finden, die einen Begriff enthalten, z. B. Finden Sie alle Dokumente, die den Begriff „Joe“ enthalten. Im obigen Beispiel möchte ich einen Abgleich mit dem Kontenarray des ersten Dokuments und dem Autor des zweiten Dokuments durchführen.
Innerhalb der Web-API habe ich einen Suchendpunkt, an dem ich hin möchte Fragen Sie die MongoDB ab und hier kommt dieser Beitrag ins Spiel. Ich kann keine Möglichkeit finden, das Inhaltsfeld abzufragen, um festzustellen, ob es den Suchbegriff enthält. Es ist mir egal, welcher Schlüssel/welche Eigenschaft den passenden Wert hat. Es interessiert mich nur, ob der Suchbegriff irgendwo im Inhalt vorkommt.
Ich habe versucht, die Regex-Methode zu verwenden:
Aber ich bekomme nie Übereinstimmungen.
Die C#-Klasse für Foo:
Wie frage ich also das Inhaltsfeld ab, um festzustellen, ob irgendein Schlüssel/eine Eigenschaft einen Wert hat, der mit meinem Suchbegriff beginnt/endet/enthält?
Sie hat das folgende Schema:
Code: Select all
_id: objectId,
sourceName: string,
content: document
Code: Select all
_id: ObjectId('66c63a62a9fa7c172aea24f8')
sourceName: "Foo-1"
content: {opName: "Django", opId: 3, accounts: ["sample1", "joe@google.com"]}
_id: ObjectId('66c63a62a9fa7c172aea24f9')
sourceName: "Foo-2"
content: {magazine: "Foo for beginners", author: "Joe Blogs"}
Innerhalb der Web-API habe ich einen Suchendpunkt, an dem ich hin möchte Fragen Sie die MongoDB ab und hier kommt dieser Beitrag ins Spiel. Ich kann keine Möglichkeit finden, das Inhaltsfeld abzufragen, um festzustellen, ob es den Suchbegriff enthält. Es ist mir egal, welcher Schlüssel/welche Eigenschaft den passenden Wert hat. Es interessiert mich nur, ob der Suchbegriff irgendwo im Inhalt vorkommt.
Ich habe versucht, die Regex-Methode zu verwenden:
Code: Select all
// request.Term = "Joe"
// _foo = mongoDbService.Database?.GetCollection("foo");
var regex = new Regex(Regex.Escape(request.Term), RegexOptions.IgnoreCase);
var filter = Builders.Filter.Regex(r => r.Content, new BsonRegularExpression(regex));
await _foo.Find(filter).ToListAsync()
Die C#-Klasse für Foo:
Code: Select all
[BsonIgnoreExtraElements]
public class Foo
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("sourceName")]
public string Source { get; set; }
[BsonElement("content")]
public BsonDocument Content { get; set; }
}