C# MongoDB 驱动程序 - 查找内容中任何位置存在值的文档

问题描述 投票:0回答:1

我有一个用 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; }
}

那么,如何查询内容字段以确定任何键/属性是否具有以我的搜索词开头/结尾/包含我的搜索词的值?

c# mongodb asp.net-core-webapi .net-9.0 mongo-driver
1个回答
0
投票

利用全文搜索功能似乎可以提供基于this帖子的解决方案。

在 MongoDB 上创建文本索引,在 Foo 集合上,使用通配符对所有文档内容建立索引。然后,在我的 API 中,我可以使用该索引执行搜索:

var filter = Builders<Foo>.Filter.Text(request.Term);
await _foo.Find(filter).ToListAsync()
© www.soinside.com 2019 - 2024. All rights reserved.