У меня есть запрос, который получает все документы из коллекции, называемой «намерениями», затем запускает поиск и получает статистику по каждому из этих намерений из другой коллекции.
Что мне нужно сделать, это удалить некоторые из этих намерений перед поиском. Критерий состоит в том, содержит ли их столбец «имя» строки, которые есть в списке.
Некоторые из этих строк состоят из нескольких слов, и они также должны игнорировать регистр. (т. е. если список содержит «Продукт», все его варианты должны быть удалены из результата запроса «Продукт», «Продукт», «Продукт» и т. д.)
Кто-нибудь знает, как мне этого добиться? Похоже, текстовый поиск - это путь, но я не верю, что могу использовать «не включая текст».
Это то, что у меня есть, он отлично работает, за исключением фильтрации элементов из списка:
cursor = self.db.intents.aggregate([
{
'$match': {
'activity_provider_id': self.activity_provider_id,
}
},
{
'$lookup': {
'from': 'messages',
'let': {'name': '$name'},
'pipeline': [
{
'$match': {
'$expr': {
'$eq': ['$triggered_intent.id', '$$name']
}
},
},
{
'$match': {
'$expr': {
'$gte': ['$at', timestamp_from]
}
}
},
{
'$match': {
'$expr': {
'$lte': ['$at', timestamp_to],
}
}
},
],
'as': 'messages_with_intent'
}
},
{
'$replaceRoot': {
'newRoot': {
'name': '$name',
'display_name': '$display_name',
'occurrences': { '$size': '$messages_with_intent' }
}
}
},
{
'$sort': {
'occurrences': -1
}
},
{
'$limit': 10
}
])