Моя цель - извлечь некоторые документы из коллекции на основе текста поиска из поля в этой коллекции и другого поля из другой коллекции.
Давайте возьмем эти документы в качестве примера (поиск должен быть выполнен в поле title
в коллекции tasks
и в поле content
в коллекции logs
):
{
task: {
_id: '1',
title: 'XXX'
},
task: {
_id: '2',
title: 'YYY'
},
task: {
_id: '3',
title: 'ZZZ'
}
}
{
log: {
_id: '1',
task: '1',
content: 'logAA'
},
log: {
_id: '2',
task: '2',
content: 'logXX'
},
log: {
_id: '3',
task: '2',
content: 'logCC'
}
}
Если, например, я выполняю поиск по тексту XX
, я должен получить задачу с идентификатором 1
(поскольку ее заголовок содержит XX), а задачу с идентификатором 2
(поскольку ее журналы содержат содержимое с значение XX внутри)
Моей первой попыткой было получение документов в коллекции logs
с помощью искомого текста, но я все еще не знаю, как объединить этот результат с поиском из поля title
в коллекции tasks
:
const tasks = await TaskModel.aggregate([
{
// This is a first criteria that must be checked before the search
$match: {certainField: certainValue}
},
{
$lookup: {
from: "logs",
let: {
taskId: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: [ "$$taskId", "$task"] },
{ $text: { $search: searchText} } //The content field in indexed as a text
]
}
}
}
],
as: "tasks"
}
}
]);
Оттуда я не смог найти, как объединить в этой же агрегации этот результат с результатом поиска из поля title