mongodb atlas 搜索嵌入文档并仅投影匹配的数组元素

问题描述 投票:0回答:1

我有一个 mongo 数据库集合,其结构如下所示。

{
_id,
name,
companies: [{
name,
rating
address
}]

}

我创建了嵌入在字段companys.name上的类型的图集索引,当我使用此索引查询时,我在结果中获取整个文档,包括数组中所有不匹配的元素。我如何投影甚至找出哪个数组元素是匹配的。我无法使用突出显示,因为嵌入式文档数据类型不支持它。我可以 $unwind 来自聚合管道的结果,但随后我必须自己在名称字段上进行匹配。对我来说,另一个选择是重组文档,但这有其他含义。我在这里有什么选择?我所需要的只是找出哪个元素是匹配的。

这是我的询问。

let query1 = {
      '$search': {
          'index': 'businessname',
          'embeddedDocument': {
            'path': 'companies', 
            'operator': {
              'queryString': {
                'defaultPath': 'companies.name', 
                'query': `${tags} ~ 2`
              }
            }
          }
        }
      }
 let project = {
      '$project': {
        '_id': 1,
        'displayName': 1,
        'email': 1,
        'companies.$': 1
      }

    }  

我在使用公司时收到以下错误。$:1 MongoServerError:$project :: 无效,原因如下: :: 无法在聚合投影中使用位置投影

mongodb aggregation-framework mongodb-atlas mongodb-atlas-search
1个回答
0
投票

对数组中的数据执行

$match
始终返回整个数组。要仅返回匹配的元素,请向
$filter
添加另一个阶段:

db.foo.aggregate([
    {$match: {"companies.name":"X5"}},
    {$project: {
        company: {$filter: {input: '$companies', cond: {$eq:['$$this.name','X5']}}}
    }}  
]);

如果您知道您的查询应该只产生 1 个项目(例如,在本例中,

companies.name
在数组中是唯一的),那么您可以通过返回单个对象而不是 1:

的数组来使其稍微容易一些
    {$project: {
        X: {$arrayElemAt:[{$filter: {input: '$companies', cond: {$eq:['$$this.name','X5']}}\
},0]}
    }}
© www.soinside.com 2019 - 2024. All rights reserved.