gpt4 book ai didi

c# - 使用正则表达式在 mongo 集合中搜索叶子内的字段

转载 作者:行者123 更新时间:2023-12-04 10:33:29 25 4
gpt4 key购买 nike

我有以下带有记录的 mongo 集合,如下面的 json 示例记录所示,表示 记录。例如,我的目标是搜索单词“CONST”并找到“FullName”字段 的记录。在“别名”子树内 包含这个词。以显示的记录为例,它应该命中,因为“别名”树中的叶子 533-1 和 533-2 在它们各自的“全名”字段中包含字符串“CONST”。例如,如果别名树仅包含树内的 533-3 叶,则不会命中。

我使用 C# 和 MongoDb.Driver 包并使用 Regex 搜索普通字段 - 例如对于此集合中的“Key”,我使用“Builders.Filter.And(filter, Builders.Filter.Regex("Key", new BsonRegularExpression("")))”模式来添加条件。但是对于“别名”子树中的这些字段,我不知道如何添加条件。在此字段上进行搜索的最简单方法是什么?

请注意,在“别名”下,每片叶子都有不同的名称(533-1、533-2 等)。每个叶子的每个名称在整个集合的每个记录中都是唯一的。
记录示例:

{
"_id" : "128c5c57-ae95-4a08-9fb8-d6eade663908",
"_t" : "Company",
"ActiveFrom" : "20190813154343",
"ActiveTo" : "30001001000001",
"GroupId" : "38547478-88ef-4caf-a6ce-1a9e6a85a59b",
"Key" : "533",
"FullName" : "RED BRIGADES",
"Countries" : [
"ITALY"
],
"MoreInfo" : null,
"RecordDetail" : "<RecordDetail></RecordDetail>",
"Aliases" : {
"533-1" : {
"Key" : "533-1",
"FullName" : "BRIGADAS ROJAS PARA LA CONSTRUCCIÓN DEL PARTIDO COMUNISTA COMBATIENTE",
"OriginalKey" : "533"
},
"533-2" : {
"Key" : "533-2",
"FullName" : "BRIGADES ROUGES POUR LA CONSTRUCTION DU PARTI COMMUNISTE COMBATTANT",
"OriginalKey" : "533"
},
"533-3" : {
"Key" : "533-3",
"FullName" : "BRIGATE ROSSE",
"OriginalKey" : "533"
},
"533-4" : {
"Key" : "533-4",
"FullName" : "BRIGATE ROSSE PER LA COSTRUZIONE DEL PARTITO COMUNISTA COMBATTENTE",
"OriginalKey" : "533"
}
}

}

最佳答案

这可能比 Ryan's 运行得慢查询,但这是可读的,你可以理解它并优化它。

db.Companies.aggregate([
// Add temporary field deconstructed_aliases to every document of collection
{
$addFields: {
deconstructed_aliases: {
$objectToArray: "$Aliases"
}
}
},
// Unwind this newly created temporary field deconstructed_aliases
{
$unwind: "$deconstructed_aliases"
},
// Match on fullName now
{
$match: {
"deconstructed_aliases.v.FullName": {
$regex: new RegExp('CONST', 'i')
}
}
},
// Project needed fields
{
$project: {
_id: 0,
key: "$deconstructed_aliases.v.Key",
fullName: "$deconstructed_aliases.v.FullName"
}
}
]);

C# 驱动程序似乎没有 addField聚合流畅界面中的辅助方法。

也没有对 objectToArray 的直接支持运算符需要规范化对象,因此创建魔术字符串作为解决方法。

这是一个相应的 C# 程序 -
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Testing
{
class Program
{
static void Main(string[] args)
{
MongoClient client = new MongoClient("mongodb://localhost:27017/test");
IMongoDatabase database = client.GetDatabase("test");
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("Companies");

string searchTerm = "CONST";
string searchResult = FetchKeysBySearchTerm(collection, searchTerm).Result.ToJson();
Console.WriteLine(searchResult);
}

public async static Task<List<BsonDocument>> FetchKeysBySearchTerm(IMongoCollection<BsonDocument> collection, string searchTerm)
{
string addFieldStage = @"{ $addFields: { deconstructed_aliases: { $objectToArray: ""$Aliases"" } } }";
string unwindStage = @"{ $unwind: ""$deconstructed_aliases"" }";
string projectStage = @"{ $project: { _id: 0, key: ""$deconstructed_aliases.v.Key"", fullName: ""$deconstructed_aliases.v.FullName"" } }";

var aggregate = collection.Aggregate()
.AppendStage<BsonDocument>(addFieldStage)
.AppendStage<BsonDocument>(unwindStage)
.Match(Builders<BsonDocument>.Filter.Regex("deconstructed_aliases.v.FullName", new BsonRegularExpression(searchTerm, "i")))
.AppendStage<BsonDocument>(projectStage);


List<BsonDocument> searchResults = await aggregate.ToListAsync();
return searchResults;
}
}
}

这是示例响应 -
[{ "key" : "533-1", "fullName" : "BRIGADAS ROJAS PARA LA CONSTRUCCIÓN DEL PARTIDO COMUNISTA COMBATIENTE" }, { "key" : "533-2", "fullName" : "BRIGADES ROUGES POUR LA CONSTRUCTION DU PARTI COMMUNISTE COMBATTANT" }]

关于c# - 使用正则表达式在 mongo 集合中搜索叶子内的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60302042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com