我有一个用 C# 编写的 ASP.NET Core 9.0 Web API,它使用 MongoDB 驱动程序 (3.1) 查询 MongoDB。 MongoDB 有一个名为
Foo
的集合,旨在包含来自各种来源的数据。
它具有以下架构:
_id: objectId,
sourceName: string,
content: document
对于任何两个文档,
content
字段很少具有相同的数据结构,例如
_id: ObjectId('66c63a62a9fa7c172aea24f8')
sourceName: "Foo-1"
content: {opName: "Django", opId: 3, accounts: ["sample1", "[email protected]"]}
_id: ObjectId('66c63a62a9fa7c172aea24f9')
sourceName: "Foo-2"
content: {magazine: "Foo for beginners", author: "Joe Blogs"}
用户要求是能够找到包含某个术语的任何文档,例如查找所有包含术语“Joe”的文档。在上面我想匹配第一个文档帐户数组和第二个文档作者。
在 Web API 中,我有一个
Search
端点,这是我想要查询 MongoDB 的地方,这就是这篇文章的来源。我找不到查询内容字段以确定它是否包含搜索词的方法。我不关心哪个键/属性具有匹配值,我只关心内容中某处是否出现搜索词。
我尝试过使用正则表达式方法:
// request.Term = "Joe"
// _foo = mongoDbService.Database?.GetCollection<Foo>("foo");
var regex = new Regex(Regex.Escape(request.Term), RegexOptions.IgnoreCase);
var filter = Builders<Foo>.Filter.Regex(r => r.Content, new BsonRegularExpression(regex));
await _foo.Find(filter).ToListAsync()
但我从来没有得到任何匹配。
Foo 的 C# 类:
[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; }
}
那么,如何查询内容字段以确定任何键/属性是否具有以我的搜索词开头/结尾/包含我的搜索词的值?
利用全文搜索功能似乎可以提供基于this帖子的解决方案。
在 MongoDB 上创建文本索引,在 Foo 集合上,使用通配符对所有文档内容建立索引。然后,在我的 API 中,我可以使用该索引执行搜索:
var filter = Builders<Foo>.Filter.Text(request.Term);
await _foo.Find(filter).ToListAsync()