跨两个集合的MongoDB文本搜索

跨两个集合的MongoDB文本搜索,mongodb,aggregation-framework,full-text-search,Mongodb,Aggregation Framework,Full Text Search,我有一个带有地址字段的订单集合和一个带有名称的用户集合。订单集合包含一个名为userId的字符串,它是用户集合中的“外键” 我使用聚合管道来过滤、连接、排序和分页查询。问题是我需要提供地址和姓名字段的全文搜索 因为$text匹配必须是管道中的第一个阶段,所以我不确定如何实现查找与任何地址或名称字段匹配的文本的目标 用户集合 [{ "_id": "5cb8caa069fc1a4351cc3705", "firstName": "James", "lastName": "Bo

我有一个带有地址字段的订单集合和一个带有名称的用户集合。订单集合包含一个名为userId的字符串,它是用户集合中的“外键”

我使用聚合管道来过滤、连接、排序和分页查询。问题是我需要提供地址和姓名字段的全文搜索

因为$text匹配必须是管道中的第一个阶段,所以我不确定如何实现查找与任何地址或名称字段匹配的文本的目标

用户集合

[{
    "_id": "5cb8caa069fc1a4351cc3705",
    "firstName": "James",
    "lastName": "Bond"
},{
    "_id": "5c58b8de8596d52c248f34d5",
    "firstName": "Jack",
    "lastName": "Ryan"
}]
[{
    "_id": "5ccc94602e67ca44fe69f160",
    "address": {
        "streetAddress1": "1112 main st",
        "streetAddress2": null,
        "unitNumber": "unit 1112",
        "city": "Jackson Hole",
        "state": "WY",
        "postalCode": "83001"
    },
    "userId": "5cb8caa069fc1a4351cc3705"
}]
订单收集

[{
    "_id": "5cb8caa069fc1a4351cc3705",
    "firstName": "James",
    "lastName": "Bond"
},{
    "_id": "5c58b8de8596d52c248f34d5",
    "firstName": "Jack",
    "lastName": "Ryan"
}]
[{
    "_id": "5ccc94602e67ca44fe69f160",
    "address": {
        "streetAddress1": "1112 main st",
        "streetAddress2": null,
        "unitNumber": "unit 1112",
        "city": "Jackson Hole",
        "state": "WY",
        "postalCode": "83001"
    },
    "userId": "5cb8caa069fc1a4351cc3705"
}]

搜索“Jack”时,应同时匹配名称“Jack”和城市“Jackson Hole”。

在此处搜索
$text
无法获得所需内容。当然,问题在于,为了找到或条件在用户的地址或名称属性中的位置(即“Jack Ryan”或詹姆斯·邦德的“Jackson Hole”),在搜索完成之前,您需要“加入”,当然您不能这样做,因为
$text
使用“索引”而且必须处于第一个聚合阶段,而这是不可能的。您可以在加入后执行
$regex
。但是,
$text
只能用作和条件。在连接之前和之后(当然是“duriling”)。也可以“澄清”,虽然可以使用
$regex
,但需要注意的是,您不能使用索引,这使得该过程非常低效。因此,你真的应该重新思考你的设计。要么在1。关系连接并不是MongoDB“擅长的”。它确实更喜欢“相关”信息通过嵌入到同一个集合中而“预先连接”。可以为同一集合中的数据编制索引,并为此类查询使用索引。2.如果“关系”模式对你很重要,考虑一个单独的专用“文本搜索引擎”,并在那里输出数据而不是这样的搜索。谢谢@ NeilLunn。我理解你所说的,我认为“非规范化”名称是一种可能性,尽管它在一致性方面提出了自己的挑战。我想知道,如果MongoDB中存在这样的概念,是否有一种方法可以将用户的名字加入到临时“视图”中的订单中,然后对其而不是原始集合执行聚合管道。因此,“视图”也是否定的。原因是MongoDB中的“视图”实际上只是“聚合管道”因此,它们不是实际的“数据副本”,并且不能自己编制索引(视图的聚合管道可以使用索引,但只能根据与任何其他聚合管道相同的第一管道阶段规则)。逻辑的最终结论通常是去规范化。是的,根据标准的关系实践,它确实存在需要管理的一致性问题,但MongoDB不是一个关系引擎,因此不应该这样使用。在这里搜索
$text
无法获得所需的内容。当然,问题在于,为了找到或条件在用户的地址或名称属性中的位置(即“Jack Ryan”或詹姆斯·邦德的“Jackson Hole”),在搜索完成之前,您需要“加入”,当然您不能这样做,因为
$text
使用“索引”而且必须处于第一个聚合阶段,而这是不可能的。您可以在加入后执行
$regex
。但是,
$text
只能用作和条件。在连接之前和之后(当然是“duriling”)。也可以“澄清”,虽然可以使用
$regex
,但需要注意的是,您不能使用索引,这使得该过程非常低效。因此,你真的应该重新思考你的设计。要么在1。关系连接并不是MongoDB“擅长的”。它确实更喜欢“相关”信息通过嵌入到同一个集合中而“预先连接”。可以为同一集合中的数据编制索引,并为此类查询使用索引。2.如果“关系”模式对你很重要,考虑一个单独的专用“文本搜索引擎”,并在那里输出数据而不是这样的搜索。谢谢@ NeilLunn。我理解你所说的,我认为“非规范化”名称是一种可能性,尽管它在一致性方面提出了自己的挑战。我想知道,如果MongoDB中存在这样的概念,是否有一种方法可以将用户的名字加入到临时“视图”中的订单中,然后对其而不是原始集合执行聚合管道。因此,“视图”也是否定的。原因是MongoDB中的“视图”实际上只是“聚合管道”因此,它们不是实际的“数据副本”,并且不能自己编制索引(视图的聚合管道可以使用索引,但只能根据与任何其他聚合管道相同的第一管道阶段规则)。逻辑的最终结论通常是去规范化。是的,根据标准关系实践,它确实存在要管理的一致性问题,但MongoDB不是一个关系引擎,不应该这样使用。