我有一个 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 :: 无效,原因如下: :: 无法在聚合投影中使用位置投影
对数组中的数据执行
$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]}
}}