mongodb - 聚合后的MongoDB匹配
问题描述
我有一个“项目”集合,其中包含一个搜索标签列表。当用户在标签字段中输入时,我想过滤所有匹配的标签,并计算该标签所属的项目数。我最初使用的是这个查询:
db.kCItem.aggregate(
[{$match:{searchTags:{$elemMatch:{tagLabel:{$regex:".*veg.*"}}}}},
{$unwind:"$searchTags"},
{$group:{_id:{tagurl:{$toLower:'$searchTags._id'},
label:"$searchTags.tagLabel"}, count: {$sum:1}}}])
这会返回一个像这样的列表:
{ "_id" : { "tagurl" : "vegetarian", "label" : "vegetarian" }, "count" : 1 }
{ "_id" : { "tagurl" : "veg", "label" : "veggie" }, "count" : 1 }
不幸的是,这个查询还带回了与匹配正则表达式的项目相关联的“其他”标签(不匹配正则表达式)。我的计划是在聚合中添加额外的 $match:
db.kCItem.aggregate([
{$match:{searchTags:{$elemMatch:{tagLabel:{$regex:".*waffle.*"}}}}},
{$unwind:"$searchTags"},
{$group:{_id:{tagurl:{$toLower: '$searchTags._id'},label:"$searchTags.tagLabel"}, count: {$sum:1}}},
{$match:{_id:{label:{$regex:"*"}}}} ])
但是,即使使用 * 作为正则表达式,当我这样做时,我也不会收到任何退货。
解决方案
最后一个聚合管道应该是
{$match : {"_id.tagurl" : {$regex : "veg"}}}
或者
{$match : {"_id.tagurl" : /veg/}}
使用点符号导航到嵌入或子元素
推荐阅读
- angularjs - 绘制角度图表时不能清空 $scope.labels 和 $scope.data
- python - 在 Excel 工作簿中打开和修改特定工作表
- angular - Docker 和身份服务器 4、api、angular:无法分配请求的地址
- flutter - 如何在颤动 24 小时后删除 SharedPreferences?
- css - 用于响应式设计的 CSS 媒体查询
- php - 使用imagick创建多页pdf
- php - 设置安装 Sylius 的 Symfony 项目会出错
- javascript - Chrome 浏览器桌面通知
- mysql - 如何使用 JSON 字段连接 MySQL 表?
- angular - 如何将初始值设置为 Angular Material mat-select multiple