【问题标题】:map/reduce function on json objects in couchdbcouchdb中json对象的map/reduce函数
【发布时间】:2013-06-11 01:18:55
【问题描述】:

我的 couchdb 数据库中有几个文档,它们都像:

{
"_id":"1234567890",
"name": [
  "category1": 5,
  "category2": 8
]
}

我想要一个 map 函数,它给我“category1”作为键和 5 作为值。 我只是无法将“类别”和 5 分开。

我尝试了以下方法:

function(doc){
    if(doc.name){
        doc.name.forEach(function(sth) {
            emit(sth, null); 
        });
    }
}

也许有人可以帮我找到解决方案?

【问题讨论】:

    标签: json mapreduce couchdb couchdb-futon


    【解决方案1】:

    请注意:

    • CouchDB 函数emit() 有两个参数,第一个是键(例如"category1"),第二个是一个值(例如5)。请参阅 CouchDB wiki 中记录的 view API。
    • [key:val, ...] 不是正确的 JSON 字段语法,您是指单字段记录列表 ([{"key1": val1}, {"key2": val2}, ...]) 还是单个多字段记录 ({"key1": val1, "key2": val2, ...})?
    • 如果"name": [{ "category1": 5}, {"category2": 8 }] 的参数forEach 延续是{"category1": 5},你应该以某种方式分别得到"category1" 和5(forEach() 或for (var key in sth) {} 再次??)。
    • 如果是"name": { "category1": 5, "category2": 8 },记住JS对象({"field": val, ...})没有forEach方法,数组([val1, val2, ...])原型有。

    假设您的意思是 "name": { "category1": 5, "category2": 8 } 作为名称,请考虑尝试以下 map:

    function (data) {
      if (date.name) {
        for (var sth in name) {
          emit(sth, name[sth]);
        }
      }
    }
    

    如果您是 JavaScript 初学者,请先尝试在控制台中编写正确的代码。您可以使用在网络浏览器中找到的那个(Firefox、Chrome 已内置,我建议 Firefox 的 FireBug 插件)。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多