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

kknvjkwl  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(141)

我有一个mongo db集合,结构如下。

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

}

字符串
我创建了一个嵌入在字段www.example.com上的类型的atlas索引companies.name,当我使用这个索引查询时,我会在结果中得到整个文档,包括数组中不匹配的所有元素。我如何投影甚至找出哪个数组元素是匹配的。我不能使用突出显示,因为它不支持嵌入式文档数据类型。我可以从聚合管道中$展开结果,但是我必须自己在name字段上进行匹配。对我来说,另一个选择是重新构造文档,但这有其他含义。这里我的选择是什么?,我所需要的就是找出哪个元素是匹配的。
这是我的疑问。

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
      }

    }


我在使用companies时得到以下错误。$:1 MongoServerError:Invalid $project::caused by::无法在聚合投影中使用位置投影

dfty9e19

dfty9e191#

对数组中的数据执行$match总是返回整个数组。要只返回匹配的元素,请为$filter添加另一个stage:

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]}
    }}

相关问题