Как Regex Match по ключевому слову в MongoDB и сортировать результаты по наиболее релевантным результатам с помощью C #? - PullRequest
1 голос
/ 15 марта 2019

Я регулярно выполняю поиск по {ключевому слову} по полю [Имя] в одной из коллекций [Брендов] БД Монго, используя C #.И результаты будут отсортированы по textMatchScore по убыванию.Результат выглядит хорошо, но формат выглядит довольно странно.

Ожидаемые результаты будут такими:

[
    {
        "id": "5c8bcbc36ad6840725182158",
        "name": "Window XP",
        "dateAdded": "2019-03-15T15:58:58.925Z"
    },
    {
        "id": "5c8bcbc96ad6840725182159",
        "name": "Wind",
        "dateAdded": "2019-03-15T15:59:05.429Z"
    },
    {
        "id": "5c8bcbd16ad684072518215a",
        "name": "Wired",
        "dateAdded": "2019-03-15T15:59:13.292Z"
    }
]

Это фактический результат.

[
    [
        {
            "name": "_id",
            "value": "5c8bcbc36ad6840725182158"
        },
        {
            "name": "Name",
            "value": "Window XP"
        },
        {
            "name": "DateAdded",
            "value": "2019-03-15T15:58:58.925Z"
        },
        {
            "name": "textMatchScore",
            "value": 0
        }
    ],
    [
        {
            "name": "_id",
            "value": "5c8bcbc96ad6840725182159"
        },
        {
            "name": "Name",
            "value": "Wind"
        },
        {
            "name": "DateAdded",
            "value": "2019-03-15T15:59:05.429Z"
        },
        {
            "name": "textMatchScore",
            "value": 0
        }
    ]
]

Это код детали C #.

[HttpGet]
public async Task<IActionResult> QueryAsync([FromQuery]string q, [FromQuery]int limit = 10, [FromQuery]int skip = 0)
{
    var mongoUrl = new MongoUrl(_mongoConfig.ConnectionString);
    var client = new MongoClient(mongoUrl);
    var database = client.GetDatabase(mongoUrl.DatabaseName);
    var collection = database.GetCollection<Brand>("Brands");

    var regex = new BsonRegularExpression($".*{q}.*","i");

    var filter = Builders<Brand>.Filter.Regex("Name", regex);
    var projection = Builders<Brand>.Projection.MetaTextScore("textMatchScore");
    var sort = Builders<Brand>.Sort.MetaTextScore("textMatchScore");

    var result = await collection.Find(filter).Project(projection).Sort(sort).Skip(skip).Limit(limit).ToListAsync();

    return Ok(result);
}

enter image description here enter image description here

Правильно ли выполнен запрос?И что я могу сделать, чтобы сделать формат результата довольно аккуратным форматом JSON?

...