1

データのクエリに問題があるため、データのモデル化が少し間違っていると思い始めています。

現在、私が持っているのは、一連の顧客 (顧客ごとのデータベースとしてモデル化) です。これらの顧客には、多数のデバイスがあります: Device1...n (デバイスごとのコレクションとしてモデル化) これらのデバイスはメッセージを生成します (デバイス コレクション内のドキュメントとしてモデル化) )。

顧客に良いフィードバックを提供するために、顧客の最新メッセージ (デバイスごとに 1 つのメッセージ) の取得をサポートしたいと考えています。

複数のコレクションに対してクエリを実行する方法を説明したドキュメントを見つけるのに苦労しています。1 人の顧客に対して何千ものデバイスが存在する可能性があるため、何千ものクエリを実行したくありません。

ありがとう!

4

1 に答える 1

3

顧客ごとに数千台のデバイスが存在する可能性があり、デバイス メッセージがデバイス固有のコレクションに保存されている場合、顧客の最新メッセージを検索するには、さまざまな数のコレクションで最新のレコードを見つける必要があります。クエリで表現しますが、非効率的でもあります。

特定の顧客のすべてのデバイスのメッセージを単一の顧客固有のコレクションに入れ、デバイス ID を各ドキュメントの属性として保存することは可能ですか?

例えば:

// create customer-specific collections
db._create("messages_customer1");
db._create("messages_customer2");

// create an index on `dt` attribute in each collection 
// so messages can be queried efficiently sorted by date
db.messages_customer1.ensureIndex({ type: "skiplist", fields: [ "dt" ]});
db.messages_customer2.ensureIndex({ type: "skiplist", fields: [ "dt" ]});

// insert some messages for customer 1
db.messages_customer1.insert({ device: 123, dt: Date.now(), message: "foo" });
db.messages_customer1.insert({ device: 123, dt: Date.now(), message: "bar" });
db.messages_customer1.insert({ device: 456, dt: Date.now(), message: "baz" });

// insert some messages for customer 2
db.messages_customer2.insert({ device: 999, dt: Date.now(), message: "qux" });
db.messages_customer2.insert({ device: 888, dt: Date.now(), message: "wut" });

これで、特定の顧客への最新のメッセージを比較的簡単に見つけることができます。

  • リクエストやビジネス ロジックを介して顧客 ID を決定する
  • 顧客 ID (例: id 1) を使用して、顧客固有のコレクションを照会します

例えば:

var query = "FOR m IN @@messages SORT m.dt DESC LIMIT 1 RETURN m";
var id = 1;
var params = { "@messages": "messages_customer" + id }
latestMessage = db._query(query, params).toArray()[0];

メッセージがすべて顧客固有のものである場合、すべての顧客固有のコレクションが同じデータベースに入る可能性があるため、顧客ごとに個別のデータベースを作成する必要もありません。もちろん、アプリケーション ビジネス ロジックまたはFoxxを介して、データへのアクセス制御に注意する必要があります。

于 2015-06-10T07:36:26.883 に答える