【问题标题】:How to emit two separate documents concurrently in CouchDB?如何在 CouchDB 中同时发出两个单独的文档?
【发布时间】:2017-08-16 17:20:42
【问题描述】:

在 CouchDB 中,我想同时发出 country 类型和 city 类型的对象。这是否可能仅在一个函数中实现?

通过链接文档,我可以发出 {_id:doc.xxx} 的对象值,如下所示:

function(doc) {
    if (doc.cities) {
        for (var i in doc.cities) {
            emit(doc.name, {_id: doc.cities[i]});
        }          
    }               
}

下面的函数是我的建议,但它不起作用,因为第二个 if 部分永远不会到达。

function(doc) {
    if (doc.type == 'country') {
      emit(doc.name, null);
    } else if (doc.cities) {    
    for (var i in doc.cities) {
          emit(doc.name, {_id: doc.cities[i]});
      } 
  }
}

文件:

// Country
{
  "_id": "country.123",
  "name": "France",
  "type": "country",
  "cities": [
    "city.123"
    ]
}

// City
{
  "_id": "city.123",
  "name": "Paris",
  "type": "city",
}

更新 1

我尝试按照 Dominic 的建议删除 else if。不幸的是,现在什么都没有发出。

function(doc) {
    if (doc.type == 'country') {
      emit(doc.name, null);
          for (var i in doc.cities) {
            emit(doc.name, {_id: doc.cities[i]});
          } 
    }
}

【问题讨论】:

  • 如果你想同时访问两个代码路径,你需要else if吗?
  • 从您的评论来看,似乎没有必要。好的。我尝试删除它,以便我首先发出我的国家/地区,然后 for-function 跟随并给我城市。那是计划,但根本没有发出任何东西。同样从您的评论来看,这应该是可能的吧?我现在不确定。

标签: javascript couchdb views map-function nosql


【解决方案1】:

我假设您想发出国家文件和链接的城市文件?

function(doc) {
  if (doc.type == 'country') {
    emit(doc._id, doc)
    if (doc.cities) {    
      for (var i in doc.cities) {
        emit(doc.name, {_id: doc.cities[i]});
      } 
    }
  }
}

【讨论】:

  • 是的,就是这样!多谢。有时这个 Map-Function 的东西让我毛骨悚然。
猜你喜欢
  • 2012-07-31
  • 2023-03-09
  • 2013-04-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多