仅返回与文本搜索匹配的数组元素

4
假设我创建了以下的数据库/集合:
use articles

db.stores.insert( [ 
             {_id : 1, arr : ['abc xyz', 'def']}, 
             {_id : 2, arr : ['jadskf', 'ljh abc']}])

db.stores.createIndex({"arr" : "text"})

我可以帮助您翻译以下内容,涉及IT技术。需要将文本搜索应用于数组arr,并仅获取与搜索匹配的数组元素。

例如:

> db.stores.find({$text : {$search : "abc"}})
{ "_id" : 1, "arr" : [ "abc xyz", "def" ] }
{ "_id" : 2, "arr" : [ "jadskf", "ljh abc" ] }

理想情况下,我希望在第一个文档中仅获得arr的第一个元素:abc xyz,并且在第二个文档中仅获得arr的第二个元素:ljh abc,同时还要匹配文档的_id。是否可能?如果是,怎么做呢?请注意,我想要的不仅仅是arr元素的简单投影,而是匹配发生的arr元素的投影。我正在使用Mongo 3.2.7。

可能是从嵌套数组集合中检索的mongoDB查询的重复问题。 - Luiz de Prá
@LuizdePrá 这是一个有些不同的问题。 - profesor79
1个回答

0

我的第一反应是我们可以使用$elemMatch,问题就解决了,但是...在$elemMatch上没有文本搜索。

从另一个角度来看,我们可以在这种情况下使用正则表达式,因为首先昂贵的扫描集合是通过文本搜索索引完成的,然后正则表达式将是一个完美的解决方案。

db.stores.find({
    $text : {
        $search : "abc"
    }
}, {
    arr : {
        $elemMatch : {
            $regex : /abc/i
        }
    }
})

欢迎任何评论!


这确实解决了问题,但并不是最优的解决方案。除了两次搜索(我同意第二次搜索不是在整个数据集上进行),文本搜索的语义与简单的正则表达式不同,例如,停用词、词干提取等在文本搜索中被使用。MongoDB 内部知道匹配发生的位置,但似乎不容易暴露出来。 - Cassio Pereira
@CassioPereira 我同意,但即使使用聚合框架也无法解决这个问题,因为$text搜索只能在第一个管道阶段中使用(而问题是我们需要做两次:( ) - profesor79

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接