У меня есть следующая коллекция для примера:
// vehicles collection
[
{
"_id": 321,
manufactor: SOME-OBJECT-ID
},
{
"_id": 123,
manufactor: ANOTHER-OBJECT-ID
},
]
И у меня есть коллекция именованных таблиц:
// tables collection
[
{
"_id": SOME-OBJECT-ID,
title: "Skoda"
},
{
"_id": ANOTHER-OBJECT-ID,
title: "Mercedes"
},
]
Как вы можете видеть, документы коллекции транспортных средств извлекают данные изколлекционные столы таблиц - первый документ в коллекции автомобилей имеет идентификатор производителя, который извлекается из коллекции таблиц и называется Skoda.
Это здорово.
Когда я запрашиваю базу данныхиспользуя агрегат, я могу легко извлечь удаленные данные из удаленных коллекций соответственно - без каких-либо проблем.Я также могу легко создавать правила и ограничения, такие как $ project, $ sort, $ skip, $ limit и др.
Но я хочу показать пользователю только те автомобили, которые производятся Mercedes.Поскольку Mercedes не упоминается в коллекции автомобилей, а указывается только его идентификатор, поиск $ text $ не вернется с правильными результатами.
Это сводный конвейер, который я предоставляю:
[
{
$match: {
$text: {
$search: "Mercedes"
}
}
},
{
$lookup: {
from: "tables",
let: {
manufactor: "$manufactor"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id", "$$manufactor"
]
}
}
},
{
$project: {
title: 1
}
}
],
as: "manufactor"
},
},
{
$unwind: "$manufactor"
},
{
$lookup: {
from: "tables",
let: {
model: "$model"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id", "$$model"
]
}
}
},
{
$project: {
title: 1
}
}
],
as: "model"
},
},
{
$unwind: "$model"
},
{
$lookup: {
from: "users",
let: {
joined_by: "$_joined_by"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id", "$$joined_by"
]
}
}
},
{
$project: {
personal_info: 1
}
}
],
as: "joined_by"
},
},
{
$unwind: "$joined_by"
}
]
Как вы можете видеть, я использую $ text и $ search $ match на первом этапе в конвейере - в противном случае MongoDB выдаст ошибку.
Но этот объект поиска $ text $ ищется только в источникеcollection - коллекция транспортных средств.
Есть ли способ указать MongoDB выполнить поиск в удаленной коллекции с помощью метода $ text и $ search и затем включить в сводные результаты только те результаты, которые соответствуют обоим?
ОБНОВЛЕНИЕ
Когда я делаю это вместо этого:
{
$lookup: {
from: "tables",
pipeline: [
{
$match: {
$text: {
$search: "Mercedes"
}
}
},
{
$project: {
title: 1
}
}
],
as: "manufactor"
},
},
Вот что я получаю:
MongoError: pipeline requires text score metadata, but there is no text score available