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

时间:2018-12-24 09:45:42

标签: database mongodb nosql aggregate

我有下一个收藏集:

// 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

1 个答案:

答案 0 :(得分:0)

如果您在此 thread 中使用受影响的版本之一,则需要更新您的 mongodb 服务器。 如您所见,该问题已在 4.1.8 版中修复