mongodb - 如何使用 MongoDB 选择子文档

标签 mongodb cakephp-2.0 database

我有一个带有子文档 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/

相关文章:

java - 如何从编号列表中取回一本书?

php - Cakephp 2.0 和基本认证

sql - 调试 SQL 查询

mysql - 获取mysql表中的最后一条记录

java - Spring Data MongoDB : MergeOperation returns the whole collection. 为什么?

mongodb - 如何在 Windows 中创建批处理文件来修复和启动损坏的 mongoDB?

node.js - 在nodejs和meteor之间共享mongodb

php - 如何在 cakePHP 2x 中公开访问 ".well-known/pki-validation/fileauth.txt"?

cakephp-2.0 - CakePHP-ajax请求完成后如何调用JS函数

php - 是否可以在没有证书或 key 的情况下使用 php 通过 ssl 连接到远程 mysql 数据库?