Найти документы CouchDB, в которых отсутствует произвольное поле - PullRequest
3 голосов
/ 31 мая 2011

Мне нужно представление CouchDB, где я могу получить обратно все документы, у которых нет произвольного поля. Это легко сделать, если вы заранее знаете, какие поля в документе могут отсутствовать . Например, , это позволяет отправлять view/my_view/?key="foo" для простого получения документов без поля "foo":

function (doc) {
  var fields = [ "foo", "bar", "etc" ];

  for (var idx in fields) {
    if (!doc.hasOwnProperty(fields[idx])) {
      emit(fields[idx], 1);
    }
  }
}

Однако вы ограничены вопросом о трех полях, установленных в представлении; что-то вроде view/my_view/?key="baz" ничего вам не даст, даже если у вас много документов пропущено в этом поле. Мне нужно посмотреть, где это будет - где мне не нужно заранее указывать возможные пропущенные поля. Есть мысли?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Эта техника называется Тайский массаж . Используйте его, чтобы эффективно находить документы , а не в представлении, если (и только если) представление имеет ключ по идентификатору документа.

function(doc) {
    // _view/fields map, showing all fields of all docs
    // In principle you could emit e.g. "foo.bar.baz"
    // for nested objects. Obviously I do not.
    for (var field in doc)
        emit(field, doc._id);
}

function(keys, vals, is_rerun) {
    // _view/fields reduce; could also be the string "_count"
    return re ? sum(vals) : vals.length;
}

Чтобы найти документы, не имеющие этого поля,

  1. GET /db/_all_docs и запомните все идентификаторы
  2. GET /db/_design/ex/_view/fields?reduce=false&key="some_field"
  3. Сравните идентификаторы из _all_docs с идентификаторами из запроса.

Идентификаторы в _all_docs, но не в представлении, - это те, в которых отсутствует это поле.

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

  1. Если full <<em> имеет , поле отсутствует, повторите со следующим full element
  2. Если full = имеет , у него есть поле, повторить со следующим full element
  3. Если полный > имеет , повторить со следующим имеет элемент

В зависимости от вашего языка это может быть сложно. Но это довольно просто, например, в Javascript или других основанных на событиях средах программирования.

1 голос
/ 01 июня 2011

Не зная заранее возможных полей, ответ прост.Вы должны создать новый вид, чтобы найти пропущенные поля.Представление будет сканировать каждый документ, один за другим.

Чтобы избежать нарушения существующих представлений и проектных документов, вы можете использовать совершенно новый проектный документ.Таким образом, поиск пропущенных полей не повлияет на существующие представления, которые вы, возможно, уже используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...