簡體   English   中英

ArangoDb從所有收藏中獲取最新文檔

[英]ArangoDb get latest document from all collections

我開始認為我已經對我的數據建模有點不正確,因為我在查詢時遇到了麻煩。

目前我擁有的是一堆客戶(每個客戶建模為數據庫)這些客戶有一堆設備:Device1 ... n(建模為每個設備的集合)這些設備生成消息(在設備集合中建模為文檔) )。

為了給客戶提供良好的反饋,我現在希望支持檢索客戶的最新消息(每個設備一條消息)。

我很難找到描述如何查詢多個集合的文檔,因為客戶可以有1000個設備,我寧願不做1000次查詢。

謝謝!

如果每個客戶可以有1000個設備,並且設備消息存儲在特定於設備的集合中,則為客戶搜索最新消息將要求您在可變數量的集合中查找最新記錄,這不僅難以在查詢中表達但效率低下。

是否可以將給定客戶的所有設備的消息放入單個特定於客戶的集合中,並將設備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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM