2016-11-04 10 views
0

Я использую метод aggregate в Mongodb для текстового поиска. Я пробовал по-разному с этим и до сих пор не могу найти правильный способ фильтрации моих результатов. Я настроил индекс, и он отлично работает только с текстовым поиском, а также отлично работает с запросом.Mongodb - как использовать агрегированный текстовый поиск с поиском запроса

Вот мой код, чтобы сделать поиск текста:

Model.aggregate([ 
    { $match: { $text: { $search: searchValue } } }, 
    { $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } }, 
    { $match: { score: { $gt: 1.0 } } } 
], function (err, models) { 

}) 

Однако я хочу, чтобы иметь возможность фильтровать модели далее по этому запросу:

Model.find({_parentIds: {$in: arrayOfIds}}) 

Я бы подумал, что это будет работать :

Model.aggregate([ 
    { $match: { $text: { $search: searchValue }, _parentIds: {$in: arrayOfIds} } }, 
    { $project: { displayTitle: 1, title: 1, body: 1, _type: 1, _id: 1, score: { $meta: "textScore" } } }, 
    { $match: { score: { $gt: 1.0 } } } 
]) 

Но, к сожалению, это не так. Кто-нибудь пробовал это или я что-то упускаю?

Вот пример коллекции Я ищу через:

[{ 
    displayTitle: "first item", 
    title: "first_item", 
    _type: "item", 
    _parentIds: ["123", "234"] 
}, { 
    displayTitle: "second item", 
    title: "second_item", 
    _type: "item", 
    _parentIds: ["123", "234"] 
}, { 
    displayTitle: "third item", 
    title: "third_item", 
    _type: "item", 
    _parentIds: ["345", "456"] 
}] 

Мой текущий поиск будет что-то вроде этого:

searchValue = "item" 
arrayOfIds = ["345"]; 

и будет ждать этот документ только обратно:

{ 
    displayTitle: "third item", 
    title: "third_item", 
    _type: "item", 
    _parentIds: ["345", "456"] 
} 

Спасибо!

+0

Можете ли вы добавить образец документа и ожидаемый результат? – Veeram

+0

@Veeram - Я добавил образец коллекции и ожидаемый результат – darylhedley

ответ

1

Оценка составляет 0,75. Таким образом, смена фильтра соответствия более чем на 0,5 работает.

Модифицированная проекция для исключения тела, _id и включения родительских идентификаторов.

Созданный индекс с этим запросом.

db.textcol.createIndex({ displayTitle: "text" }) 

Выполнение этого запроса.

db.textcol.aggregate([ 
    { $match: { $text: { $search: "item" }, _parentIds: {$in: ["345"]} }} , 
    { $project: { displayTitle: 1, title: 1, _type: 1, _id: 0, _parentIds :1, score: { $meta: "textScore" } }}, 
     { $match: { score: { $gt: 0.5 } } } 
]) 

Выход:

{ 
    "displayTitle": "third item", 
    "title": "third_item", 
    "_type": "item", 
    "_parentIds": ["345", "456"], 
    "score": 0.75 
} 
+0

Спасибо !!! Это спасло меня! Итак, моя фактическая проблема, о которой я должен был быть более понятной, - это вернуть результаты, которых я не хотел (так что модели, у которых не было _parentId в массиве _parentIds). Решение выше зафиксировано, и основная причина заключалась в том, что _parentIds: 1 и _id: 0 в $ project и $ match score были слишком высокими - не знаю, как я этого не видел ... – darylhedley