mongoDB聚合:在多维数组上查找值

时间:2012-11-23 09:09:41

标签: mongodb aggregation-framework

几天前我正在使用MongoDB和聚合功能,但我无法获得我正在寻找的结果。

假设一个集合包含这样的文档:

[_id] => 2Q4YkrDUPIdMpHYdG7e801
[domain] => notedlinks.loc
[updateDate] => 1353582907
[pageCaches] => Array (
[0] => Array (
    [url] => 421341234213470dfb61366
    [data] => Array (
        [domain] => notedlinks.loc
        [url] => http://notedlinks.loc/sample/node
        [contentHash] => 382a250d4c226bb85b910c04d1774bb7a9020e44
        [percent] => 100
        [info] => Array (
            [results] => Array (
                [0] => Array (
                    [tag] => Twitter
                    [url] => http://dbpedia.org/resource/Twitter
                    [references] => Array (
                        [0] => twitter
                    )
                )
            )
        )
        [updateDate] => 1353582907
    )
)
[1] => Array (
    [url] => 786527618a424234be70dfb61366
    [data] => Array (
        [domain] => notedlinks.loc
        [url] => http://notedlinks.loc/sample/node
        [contentHash] => 382a250d4c226bb85b910c04d1774bb7a9020e44
        [percent] => 100
        [info] => Array (
            [results] => Array (
                [0] => Array (
                    [tag] => Twitter
                    [url] => http://dbpedia.org/resource/Twitter
                    [references] => Array (
                        [0] => twitter
                    )
                )
            )
        )
        [updateDate] => 1353582907
    )
)
)

最初,对于搜索,我有:要搜索的colection,_id值和url值。

意图是针对特定网址,例如:url:'786527618a424234be70dfb61366',以获取与该网址关联的“数据”的值,而不加载所有文档内容。仅限获取:

 [data] => Array (
        [domain] => notedlinks.loc
        [url] => http://notedlinks.loc/sample/node
        [contentHash] => 382a250d4c226bb85b910c04d1774bb7a9020e44
        [percent] => 100
        [info] => Array (
            [results] => Array (
                [0] => Array (
                    [tag] => Twitter
                    [url] => http://dbpedia.org/resource/Twitter
                    [references] => Array (
                        [0] => twitter
                    )
                )
            )
        )
        [updateDate] => 1353582907
    )

我一直在使用某种形式,但没有成功的结果。 例如:

db.dm_2Q.aggregate({ $match: { _id : "2Q4YkrDUPIdMpHYdG7e801"}, $unwind : "$pageCaches", $project : {pageCaches: 1}, $match : {"pageCaches.url" : "786527618a424234be70dfb61366"}});

{
"result" : [
    {
        "_id" : "2Q4YkrDUPIdMpHYdG7e801",
        "pageCaches" : [
            {
                "url" : "786527618a42084367ccbe70dfb61366",
                "data" : {
                    "domain" : "notedlinks.loc",
                    "url" : "http://notedlinks.loc/sample/node",
                    "contentHash" : "382a250d4c226bb85b910c04d1774bb7a9020e44",
                    "percent" : "100",
                    "info" : {
                        "results" : [
                            {
                                "tag" : "Twitter",
                                "url" : "http://dbpedia.org/resource/Twitter",
                                "references" : [
                                    "twitter"
                                ]
                            }
                        ]
                    },
                    "updateDate" : 1353582907
                }
            },
            {
                "url" : "786527618a424234be70dfb61366",
                "data" : {
                    "domain" : "notedlinks.loc",
                    "url" : "http://notedlinks.loc/sample/node",
                    "contentHash" : "382a250d4c226bb85b910c04d1774bb7a9020e44",
                    "percent" : "100",
                    "info" : {
                        "results" : [
                            {
                                "tag" : "Twitter",
                                "url" : "http://dbpedia.org/resource/Twitter",
                                "references" : [
                                    "twitter"
                                ]
                            }
                        ]
                    },
                    "updateDate" : 1353582907
                }
            }
        ]
    }
],
"ok" : 1
}

1 个答案:

答案 0 :(得分:1)

最后,我找到了解决方案:

db.dm_2Q.aggregate({$unwind: "$pageCaches"},
{$match:{ "pageCaches.url": "786527618a424234be70dfb61366"}}, 
{$project : {"pageCaches.data": 1}});

{
"result" : [
    {
        "_id" : "2Q4YkrDUPIdMpHYdG7e801",
        "pageCaches" : {
            "data" : {
                "domain" : "notedlinks.loc",
                "url" : "http://notedlinks.loc/sample/node",
                "contentHash" : "382a250d4c226bb85b910c04d1774bb7a9020e44",
                "percent" : "100",
                "info" : {
                    "results" : [
                        {
                            "tag" : "Twitter",
                            "url" : "http://dbpedia.org/resource/Twitter",
                            "references" : [
                                "twitter"
                            ]
                        }
                    ]
                },
                "updateDate" : 1353582907
            }
        }
    }
],
"ok" : 1
}