1

我在文档中有一个字典字段。

带有“国家”字段的示例文档:

...
"countries": {
    "us": {
        "uid": "725129b4-debe-47dc-9ab0-aa8aa620e35b"
    },
    "canada": {
        "uid": "83250bc5-49ae-4775-a933-d7a3e9d00d1c"
    },
    "uk": {
        "path": "/uk/",
        "uid": "e32347a9-522c-4c66-be3b-3edfd50c76bb"
    },
    "spain": {
        "path": "/spain/",
        "uid": "93ecd56b-1ed2-4647-bee8-8685183eca2e"
    },
    "india": {
        "path": "/india/",
        "uid": "c4458535-c63b-45e1-bb24-cabbc65d59a4"
    }
}
...

我需要从所有文件中获取具有“路径”属性的国家/地区吗?

4

1 回答 1

0

虽然更改数据结构将是最佳选择(因为查询效率更高,并且不需要辅助集合——甚至在保存文档时将其双重存储可能会更好),您可以尝试使用 MapReduce 来获取如果你不能改变你的数据结构的结果。您可能需要进行增量更新,并注意结果可能并不总是最新的。

这是一个简单的版本(在 JavaScript 中):

map = function () {
    // loop through the countries node
    if (this.countries) {
        for(var name in this.countries) {
            if (typeof this.countries[name].path !== 'undefined') {
            // emit a unique combo id so that the reduce will only have
            // one value to reduce later
            emit({id: this._id, country: name}, this.countries[name].path);
            }
        }
    }
};

reduce = function(key, values) {
    // return the one value
    return values;
};

然后,运行reduce:

db.so.mapReduce(map, reduce, {out: "so_map"})

产生类似的东西(给定您的示例数据):

> db.so_map.find()
{ "_id" : { "id" : ObjectId("5183e08be71ddfd99756386c"), "country" : "india" }, "value" : "/india/" }
{ "_id" : { "id" : ObjectId("5183e08be71ddfd99756386c"), "country" : "spain" }, "value" : "/spain/" }
{ "_id" : { "id" : ObjectId("5183e08be71ddfd99756386c"), "country" : "uk" }, "value" : "/uk/" }
于 2013-05-03T16:22:18.873 回答