Couchdb документ/функция

В документе со следующей информацией:

{
  "address": [{
    "Street": "123 xyz", 
    "City": "Belmont"
  }]
}

Как посмотреть названия городов. Это правильно:

function(doc) {
  emit(doc.address.City,null);
}

Он возвращает только null. Я хотел увидеть имя "Бельмонт". Любая помощь с благодарностью.


person user3323595    schedule 21.02.2014    source источник


Ответы (1)


В ваших данных address — это массив, поэтому у него нет свойства City.

Если у вас есть только один адрес в ваших данных:

{
  "address": {
    "Street": "123 xyz", 
    "City": "Belmont"
  }
}

Получение /{database}/_design/{ddoc}/_view/{view} должно вернуть:

{"rows":[
  {"key":"Belmont", "id":"{id}", "value":null}
]}

В качестве примечания обратите внимание, что вы также можете получить /{database}/_design/{ddoc}/_view/{view}?include_docs=true:

{"rows":[
  {"key":"Belmont", "id":"{id}", "value":null, "doc":{
    "address": {
      "Street": "123 xyz", 
      "City": "Belmont"
    }
  }}
]}

И последнее, но не менее важное: если вам действительно нужно несколько адресов в ваших данных, вы можете отправить их все:

function(o) {
  for each (var a in o.address) {
    emit(a.City);
  }
}
person Aurélien    schedule 21.02.2014
comment
{ name: jack, address: [{ Street: 123 xyz, City: Belmont }] } , если бы у меня также было имя, смогу ли я увидеть имя рядом с городом, основываясь на последней написанной вами функции. Спасибо за вашу помощь. я хочу видеть, что имя является ключом, а город - значением. - person user3323595; 21.02.2014
comment
С include_docs=true вы действительно получите полный документ (с Джеком и всеми его адресами). Вам нужно помнить, что key — это то, что вы используете для выбора или сортировки строк, value — это либо результат сложного вычисления, который вы хотите сохранить, либо частичный результат, который вы хотите агрегировать с помощью функции reduce, doc это, ну, весь документ. - person Aurélien; 21.02.2014