У меня есть коллекция «клиентов» с такой структурой данных, и мне нужно искать по имени, фамилии или дате рождения на корневом уровне или в записях AlternateClientData
:
{
"_id" : GUID,
"FirstName" : "string",
"LastName" : "string",
"DateOfBirth" : "YYYY-MM-dd",
"AlternateClientData" : [
{
"AccountId" : GUID,
"FirstName" : "string",
"LastName" : "string",
"DateOfBirth" : "string",
},
]
}
Я использую драйвер С# Mongo, и поисковый запрос выглядит примерно так:
"filter": {
"AlternateClientData": {
"$elemMatch": {
"AccountId": {
"$ne": null,
"$in": [ /* one or many account IDs */]
}
}
},
"$or": [
{
"FirstName": {
"$regex": "^FName",
"$options": "i"
}
},
{
"AlternateClientData": {
"$elemMatch": {
"FirstName": {
"$regex": "^FName",
"$options": "i"
}
}
}
},
{
"LastName": {
"$regex": "^LName",
"$options": "i"
}
},
{
"AlternateClientData": {
"$elemMatch": {
"LastName": {
"$regex": "^LName",
"$options": "i"
}
}
}
},
{
"DateOfBirth": "1970-01-01"
},
{
"AlternateClientData": {
"$elemMatch": {
"DateOfBirth": "1970-01-01"
}
}
}
]
}
Я попытался добавить такой индекс, но монго его не использует:
{
"FirstName" : NumberLong(1),
"LastName" : NumberLong(1),
"DateOfBirth" : NumberLong(1),
"AlternateClientData.FirstName" : NumberLong(1),
"AlternateClientData.LastName" : NumberLong(1),
"AlternateClientData.DateOfBirth" : NumberLong(1),
"AlternateClientData.AccountId" : NumberLong(1)
}
Примечание: я спорил с власть имущими о том, что нам нужно потратить время на создание надлежащего поискового сервиса с использованием чего-то вроде Elastic Search, но на данный момент это не является приоритетом, поэтому я пока застрял на Mongo. Единственное, что осталось сделать на данный момент, это создать отдельную коллекцию для поиска и сгладить + проиндексировать доступные для поиска данные?