我有一个带有子文档 tags 的集合,例如:
Collection News :
title (string)
tags: [tag1, tag2...]
我想选择所有以模式开头的标签,但只返回匹配的标签。
我已经使用了一个正则表达式,但它返回所有包含匹配标签的新闻,这里是查询:
db.news.find( {"tags":/^proga/i}, ["tags"] ).sort( {"tags":1} ).
limit( 0 ).skip( 0 )
我的问题是:如何(仅)检索与模式匹配的所有标签? (最终目标是制作一个自动填充字段)
我也尝试过使用 distinct,但我没有找到一种方法来区分 find,它总是返回我所有的标签 :(
感谢您的宝贵时间
最佳答案
聚会有点晚了,但希望能帮助其他正在寻找解决方案的人。我找到了一种使用聚合框架并将 $project 和 $unwind 与 $match 组合在一起的方法,方法是将它们链接在一起。我已经使用 PHP 完成了,但你应该明白要点:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
第一个匹配项和项目仅用于过滤以使其更快,然后子集合上的展开逐项吐出每个子集合,然后可以使用最终匹配项进行过滤。
希望对您有所帮助。
更新(来自 Ryan Wheale):
然后您可以$group
将数据恢复为其原始结构。这就像有一个返回多个子文档的 $elemMatch
:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
我把它从 Node 翻译成 PHP,所以我没有在 PHP 中测试过。如果有人想要 Node 版本,请在下方留言,我会答应的。
关于mongodb - 如何使用 MongoDB 选择子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8861938/