0

値の分布が事前にわからないテキスト データのストリームを処理していますが、それぞれが次のようになっていることはわかっています。

{
  "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"}
    ]
  }
}

目的は、最終的に各バケット内の各単語の出現回数をカウントすることです。

私は約 100 万個のバケツを扱っており、事前に単語についての知識がないため、このオブジェクトをその場で作成する予定です。ただし、私は 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);
  });

});

ここで run を 2 回実行する必要がありますか?それとも、RethinkDB を使用して物事を適切に連鎖させる方法に基づいていませんか? これにもっと深く入る前に、これを間違った/難しい方法で行っていないことを確認したいだけです。

4

1 に答える 1

3

run必要に応じて、複数回実行する必要はありません。基本的に、run()チェーンを終了し、クエリをサーバーに送信します。したがって、クエリを構築するためにすべてのことを行い、それrun()を実行するために終了します。2回使用run()すると、サーバーに2回送信されます。

したがって、RethinkDB 関数のみを使用してすべての処理を実行できる場合は、run を 1 回だけ呼び出す必要があります。ただし、クライアント側を使用してある種の後処理データが必要な場合は、選択の余地がありません。通常、私は 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() })

})
于 2016-01-22T18:39:08.780 に答える