couchdb; как получить документы непосредственно на первом уровне json, а не сгруппировать внутри значения - viewWithList

У меня есть проектный документ: «учетные записи» и представление: «учетные записи-просмотр».

содержание представления:

function (doc) {
  emit( doc._id, doc);
}

И мой код в экспрессе:

db.view('accounts', 'accounts-view', function(err, body) {
    if (err) throw error;
    res.json(body.rows);
});

Результат:

[
  {
    "id": "8767d3474a0e80dd0ab7d0b0580065af",
    "key": "8767d3474a0e80dd0ab7d0b0580065af",
    "value": {
      "_id": "8767d3474a0e80dd0ab7d0b0580065af",
      "_rev": "1-37eb3e76e4715e9a4fc8930470cc4ca3",
      "type": "accounts",
      "lastname": "Kitchen",
      "firstname": "Peter"
    }
  },
  {
    "id": "8767d3474a0e80dd0ab7d0b058006e3c",
    "key": "8767d3474a0e80dd0ab7d0b058006e3c",
    "value": {
      "_id": "8767d3474a0e80dd0ab7d0b058006e3c",
      "_rev": "1-bcab94bb253c83b4951a787c253896f5",
      "type": "accounts",
      "lastname": "Kolner",
      "firstname": "John"
    }
  }
]

Как я могу получить что-то вроде этого: (просто печатать все внутри значения для каждой строки)

[
  {
     "_id": "8767d3474a0e80dd0ab7d0b0580065af",
      "_rev": "1-37eb3e76e4715e9a4fc8930470cc4ca3",
      "type": "accounts",
      "lastname": "Kitchen",
      "firstname": "Peter"

  },
  {

      "_id": "8767d3474a0e80dd0ab7d0b058006e3c",
      "_rev": "1-bcab94bb253c83b4951a787c253896f5",
      "type": "accounts",
      "lastname": "Kolner",
      "firstname": "John"

  }
]

ОБНОВИТЬ:

Я следую советам Domonique; и теперь у меня есть новое представление, которое выдает только идентификатор (так что я могу сэкономить место на диске и получить документ с параметром "include_docs = true" в представлении):

function(doc) {
  if (doc.type && doc.type=='accounts') {
    emit( doc._id);
  }
}

и новый список:

function(head, req) {
  provides('json', function() {
    var results = [];
    while (row = getRow()) {
      //results.push(row.value);
      results.push(row.doc);
    }
    send(JSON.stringify(results));
  });
}

Наконец, я получаю записи:

http://127.0.0.1:5984/crm/_design/crmapp/_list/accounts-list/accounts-view?include_docs=true

и результат:

[
  {
    "_id": "8767d3474a0e80dd0ab7d0b0580065af",
    "_rev": "1-37eb3e76e4715e9a4fc8930470cc4ca3",
    "type": "accounts",
    "lastname": "Kitchen",
    "firstname": "Peter"
  },
  {
    "_id": "8767d3474a0e80dd0ab7d0b058006e3c",
    "_rev": "1-bcab94bb253c83b4951a787c253896f5",
    "type": "accounts",
    "lastname": "Kolner",
    "firstname": "John"
  },
  {
    "_id": "8767d3474a0e80dd0ab7d0b058008e9a",
    "_rev": "1-86078f00be82b97499a0f52488cefbbf",
    "lastname": "Tower",
    "firstname": "George",
    "type": "accounts"
  }
]

мой экспресс-узел приложения обновлен:

db.viewWithList('crmapp', 'accounts-view','accounts-list', {"include_docs":"true"} , function(err, body) {
    if (err) throw err;
    res.json(body);
});

с этим списком, мне не нужно больше сокращать его в экспресс-проекте, это нормально? Как обновить мой список или представление, чтобы получить по идентификатору? он не работает, просто добавляя идентификатор в URL-адрес; нравится:

http://127.0.0.1:5984/crm/_design/crmapp/_list/accounts-list/accounts-view?include_docs=true&_id=8767d3474a0e80dd0ab7d0b058006e3c

Я получаю все записи, а не единственные по id


person stackdave    schedule 03.12.2016    source источник


Ответы (1)


Чтобы ответить на свой вопрос здесь, вы должны просто map массив и включать только value часть:

db.view('accounts', 'accounts-view', function(err, body) {
  if (err) throw error;
  res.json(body.rows.map(function (row) {
    return row.value;
  }));
});

Поскольку очевидно, что вы новичок в CouchDB, я также дам вам несколько советов относительно представлений. Во-первых, созданное вами представление на самом деле является копией системного представления _all_docs, поэтому вам следует просто использовать его, а не создавать свое собственное представление. (тем более, что вы фактически создали дубликат на диске)

Однако весьма вероятно, что по мере продвижения в приложении вы будете использовать реальные представления, которые по-разному разбивают документы в зависимости от запроса. Таким образом, вам не следует не выдавать весь документ (например, doc) в функции просмотра. Делая это, вы эффективно дублируете этот документ на диске, поскольку он будет представлен в вашей базе данных, а также в индексе представления.

Рекомендуемая отправная точка - просто опустить второй аргумент вашего emit.

function (doc) {
  emit(doc._id);
}

Когда вы запрашиваете представление, вы можете просто добавить include_docs=true к URL-адресу, и ваше представление будет выглядеть примерно так:

[
  {
    "id": "8767d3474a0e80dd0ab7d0b0580065af",
    "key": "8767d3474a0e80dd0ab7d0b0580065af",
    "value": null,
    "doc": {
      "_id": "8767d3474a0e80dd0ab7d0b0580065af",
      "_rev": "1-37eb3e76e4715e9a4fc8930470cc4ca3",
      "type": "accounts",
      "lastname": "Kitchen",
      "firstname": "Peter"
    }
  }
  // ...
]

Затем вы можете получить doc вместо value, чтобы добиться того же результата гораздо более эффективно.

person Dominic Barnes    schedule 04.12.2016
comment
это умно, включая просто emit (doc._id), поэтому я экономлю место на диске? я не читал это в уроках, но это хорошая идея - person stackdave; 04.12.2016
comment
Я использовал couchapp, а затем у меня есть эта функция на сервере (более эффективно делать карту в приложении узла ??): function (head, req) {provides ('json', function () {var results = []; while (row = getRow ()) {results.push (row.value);} отправить (JSON.stringify (результаты));}); } - person stackdave; 04.12.2016
comment
Я только что выдал (doc._id), но у меня еще много полей: {id: 8767d3474a0e80dd0ab7d0b058006e3c, key: 8767d3474a0e80dd0ab7d0b058006e3c, value: null, _id: 8767d34d74a07d - person stackdave; 04.12.2016
comment
Не забывайте include_docs=true, как я уже упоминал в ответе. - person Dominic Barnes; 04.12.2016
comment
Я сделал это, и работает хорошо, но я использую список с представлением, это лучше, чем уменьшить его в приложении узла? пожалуйста, посмотрите мой обновленный ответ - person stackdave; 04.12.2016