ArangoDb从所有馆藏获取最新文件

时间:2015-06-09 17:26:45

标签: arangodb aql nosql

我开始认为我的数据模型有点不正确,因为我查询时遇到了麻烦。

目前我拥有的是一群客户(按客户建模为数据库) 这些客户有一堆设备:Device1 ... n(建模为每个设备的集合) 这些设备生成消息(在设备集合中建模为文档)。

为了向客户提供良好的反馈,我现在希望支持检索客户的最新消息(每台设备一条消息)。

我无法找到描述如何查询多个馆藏的文档,因为客户可能有1000多台设备,我宁愿不进行1000次查询。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果每个客户可以有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(例如,标识为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