我有下一个收藏集:
// 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的ID。
那太好了。
使用聚合查询数据库时,我可以轻松地从远程集合中提取远程数据 分别-没有任何问题。 我还可以轻松制定规则和限制,例如$ project,$ sort,$ skip,$ limit等。
但是我只想向用户显示梅赛德斯制造的那些车辆。 由于没有在车辆集合中提及梅赛德斯,而是仅提及其ID,因此$ text $ search不会 返回正确的结果。
这是我提供的汇总管道:
[
{
$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"
}
]
如您所见,我在pipleline的第一阶段使用$ text和$ search $ match-否则 MongoDB将引发错误。
但是这个$ text $ search对象仅在原始集合-车辆集合中隐藏了。
是否有一种方法可以告诉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