Представление не обновляется, чтобы добавить объект, который ранее игнорировался

Нет документа в поле зрения после того, как документ был вставлен в корзину.

Мой документ:

{
  "state": 1,
  "rdbms_id": 0,  
  "startDate": 1511882685998,
  "endDate": -1,  
  "type": "kv",
  "userid": 1222,
  "uuid": "84fd36ad-b8bd-4abb-90ac-eae407f9364a",  
  "amount": 1234,
  "source_id": 12
}

Код индекса просмотра:

function (doc, meta) {
  if(meta.type=="json"){        
    if(doc.type && doc.type === "kv"){      
      if(doc.startDate && doc.startDate<=Date.now()){
        if(doc.endDate && (doc.endDate>=Date.now() || doc.endDate==-1)){
          if(doc.state && doc.state==1){
          emit([doc.userid,doc.source_id], null);
          }
        }
      }
    }
  }
}

Мой запрос просмотра:

curl http://Administrator:pass@localhost:8092/bss_write/_design/fihrist/_view/forUcrKVIds?limit=6&stale=false&connection_timeout=60000&inclusive_end=true&skip=0    

Представление обновляется при добавлении документа с помощью curl.

curl -H "Content-Type: application/json" -X POST -v -d 'Jsondocument' 'http://Administrator:pass@localhost:8091/pools/default/buckets/bss_write/docs/kv-84fd36ad-b8bd-4abb-90ac-eae407f9364a'

Но представление не обновляется, когда вы добавляете его с помощью программы.

Cluster cluster = CouchbaseCluster.create("localhost");
cluster.authenticate("username", "");
Bucket bucket = cluster.openBucket("bss_write");

JsonObject doc = JsonObject.fromJson(Jsondocument);

bucket.upsert(JsonDocument.create(type+"-"+uuid, doc));

Нужно ли запускать процедуру для программного обновления представления?

Обновление 2:

Проблема в разнице во времени. При добавлении документа представление не обновляется, поскольку условие даты не соответствует.

Однако представление не обновляется, даже если условия представления выполняются после добавления документа.

Например:

My computer timestamp is 1512054982454.
Couchbase server timestamp is 1512054876554.

function (doc, meta) {
  if(meta.type=="json"){        
    if(doc.type && doc.type === "kv"){      
---->if(doc.startDate && doc.startDate<=Date.now()){ //This returns false.
        if(doc.endDate && (doc.endDate>=Date.now() || doc.endDate==-1)){
          if(doc.state && doc.state==1){
          emit([doc.userid,doc.source_id], null);
          }
        }
      }
    }
  }
}

person onder    schedule 30.11.2017    source источник
comment
Он не появляется никогда? Или просто не сразу? Представления Couchbase часто значительно отстают от основного хранилища данных из-за времени, необходимого для их переиндексации.   -  person theMayer    schedule 04.12.2017
comment
Хотя я жду в течение долгого времени, он никогда не появляется. переиндексация выполняется только путем удаления и повторного создания представления.   -  person onder    schedule 05.12.2017
comment
Ааа, кажется, я понимаю, о чем вы говорите. Вы хотите, чтобы представление динамически обновлялось. Такое невозможно без соответствующего обновления самого объекта.   -  person theMayer    schedule 05.12.2017


Ответы (1)


Фон

Давайте разберем, что здесь происходит, с высокого уровня:

  1. Документ добавлен в корзину

  2. Механизм просмотра обрабатывает документ, чтобы определить, будет ли он добавлен в представление.

  3. Если соблюдается ряд условий, как описано в вашем вопросе, документ добавляется в представление. В противном случае документ игнорируется. Конкретно,

    if(doc.startDate && doc.startDate<=Date.now())

  4. Если позже документ будет обновлен, представление повторно обработает его, и он может быть включен или не включен.

Проблема

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

Проблема здесь в том, что этап компиляции представления выполняет этап запроса. Логика компиляции запускается один раз для каждого объекта и не будет запускаться снова, пока объект не изменится или вы не укажете CB пересчитать представление. Если ваша компиляция изначально не включает этот объект, она никогда не будет включена.

Решение

Измените функцию map/reduce, чтобы она испускала все объекты, которые вы хотите, удаляя любые зависимости от Date.Now. Измените код запроса, чтобы выбирать только элементы, соответствующие заданным критериям, которые в настоящее время определены в вашем запросе.

Обратите внимание, что может оказаться более эффективным загружать результаты широкого запроса представления в память хоста веб-службы, используя код Java для детального выбора до предоставления результатов клиенту. Я обнаружил, что такой подход обеспечивает чрезвычайно высокую производительность.

person theMayer    schedule 05.12.2017