2016-01-22 2 views
0

Я обрабатываю поток текстовых данных, где я не знаю заранее, что распределение ее значения, но я знаю, что каждый из них выглядит следующим образом:Должным цепочки таблицы и объекта Создание RethinkDB команды с rethinkdbdash

{ 
    "datetime": "1986-11-03T08:30:00-07:00", 
    "word": "wordA", 
    "value": "someValue" 
} 

Я пытаюсь ведро его в объекты RethinkDB на основе его значение, в котором объекты выглядят следующим образом:

{ 
    "bucketId": "1", 
    "bucketValues": { 
    "wordA": [ 
     {"datetime": "1986-11-03T08:30:00-07:00"}, 
     {"datetime": "1986-11-03T08:30:00-07:00"} 
    ], 
    "wordB": [ 
     {"datetime": "1986-11-03T08:30:00-07:00"}, 
     {"datetime": "1986-11-03T08:30:00-07:00"} 
    ] 
    } 
} 

цель состоит в том, чтобы в конечном счете подсчитать количество вхождений каждого слова в каждом ведре ,

Поскольку я имею дело с миллионными ведрами и не знаю слов раньше, план заключается в создании этих объектов на лету. Однако я новичок в RethinkDB, и я старался изо всех сил сделать это таким образом, что я не пытаюсь добавить ключ word в ведро, которое еще не существует, но я не совсем уверен, что если я «м следуя передовой опыт здесь цепочки команд следующим образом (обратите внимание, что я бег это на сервере Node.js с помощью:

var bucketId = "someId"; 
var word = "someWordValue" 
r.do(r.table("buckets").get(bucketId), function(result) { 
    return r.branch(
    // If the bucket doesn't exist 
    result.eq(null), 
    // Create it 
    r.table("buckets").insert({ 
     "id": bucketId, 
     "bucketValues" : {} 
    }), 
    // Else do nothing 
    "Bucket already exists" 
); 
}) 
.run() 
.then(function(result) { 
    console.log(result); 

    r.table("buckets").get(bucketId) 
    .do(function(bucket) { 
    return r.branch(
     // if the word already exists 
     bucket("bucketValues").keys().contains(word), 
     // Just append to it (code not implemented yet) 
     "Word already exists", 
     // Else create the word and append it 
     r.table("buckets").get(bucketId).update(
     {"bucketValues": r.object(word, [/*Put the timestamp here*/])} 
    ) 
    ); 
    }) 
    .run() 
    .then(function(result) { 
    console.log(result); 
    }); 

}); 

Мне нужно выполнить запустить здесь два раза делать, или я способ покинуть базу на как вы должны правильно комбинировать вещи вместе с RethinkDB? Я просто хочу убедиться, что я не делаю этого неправильно/трудно, прежде чем я углубится в это.

ответ

3

Вам не обязательно выполнять run несколько раз, зависит от того, что вы хотите. а именно, run() завершает цепочку и отправляет запрос на сервер. Поэтому мы делаем все, чтобы построить запрос, и закончим его run(), чтобы выполнить его. Если вы используете run() два раза, это означает, что он отправляется на сервер 2 раза.

Так что, если мы можем выполнять всю обработку, используя только функцию RethinkDB, нам нужно вызвать run только один раз. Однако, если мы хотим получить какие-то данные после обработки, используя клиентскую сторону, тогда у нас нет выбора. Обычно я пытался выполнять всю обработку с помощью RethinkDB: с помощью структуры управления, циклизации и анонимной функции мы можем идти довольно далеко, не позволяя клиенту сделать некоторую логику.

В вашем случае, запрос может быть переписан с NodeJS, используя официальные драйвера:

var r = require('rethinkdb') 

var bucketId = "someId2"; 
var word = "someWordValue2"; 

r.connect() 
.then((conn) => { 
    r.table("buckets").insert({ 
     "id": bucketId, 
     "bucketValues" : {} 
    }) 
    .do((result) => { 
    // We don't care about result at all 
    // We just want to ensure it's there 
    return r.table('buckets').get(bucketId) 
     .update(function(bucket) { 
     return { 
      'bucketValues': r.object(
          word, 
          bucket('bucketValues')(word).default([]) 
          .append(r.now())) 
     } 
     }) 
    }) 
    .run(conn) 
    .then((result) => { conn.close() }) 

}) 
+0

Отлично, что работал отлично. Спасибо! – Brideau

Смежные вопросы