如何在$lookup管道中使用$text搜索



我有下一个集合,例如:

// vehicles collection
[
{
"_id": 321,
manufactor: SOME-OBJECT-ID
},
{
"_id": 123,
manufactor: ANOTHER-OBJECT-ID
},
]

我有一个名为tables的集合:

// tables collection
[
{
"_id": SOME-OBJECT-ID,
title: "Skoda"
},
{
"_id": ANOTHER-OBJECT-ID,
title: "Mercedes"
},
]

正如您所看到的,车辆集合的文档正在从表的收藏-车辆收藏中的第一个文件有一个制造商id,该id从表集合中提取并命名为Skoda。

太好了。

当我使用聚合查询数据库时,我可以很容易地从远程集合中提取远程数据没有任何问题。我还可以很容易地制定规则和限制,如$project、$sort、$skip、$limit等。

但我只想向用户展示那些由梅赛德斯制造的车辆。由于车辆收藏中没有提到梅赛德斯,只提到了它的ID,$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"
}
]

正如你所看到的,我在pipleline的第一阶段使用$text和$search$匹配,否则MongoDB将抛出一个错误。

但这个$text$搜索对象只在原始集合-车辆集合中存在。

有没有办法告诉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

如果您在此线程中使用受影响的版本之一,则需要更新您的mongodb服务器。正如你所看到的,这个问题在4.1.8版中得到了修复

最新更新