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

时间:2016-06-28 20:27:54

标签: arrays mongodb full-text-search

假设我创建了以下db / collection:

use articles

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

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

我想对数组arr进行文本搜索,只获取与搜索匹配的数组元素。

例如,

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

理想情况下,我只想获取第一个文档中arr的第一个元素:abc xyz,而只获取第二个文档中arr的第二个元素:{{ 1}},以及匹配文档的ljh abc

这可能吗?如果是这样,怎么样?

请注意,我想要的不是_id元素的简单投影,而是发生匹配的arr元素的简单投影。

我正在使用Mongo 3.2.7。

1 个答案:

答案 0 :(得分:0)

我的第一个想法是我们可以使用$elemMatch并解决问题,但是...... $elemMatch上没有文字搜索。

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

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

欢迎任何评论!