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
- 带customer id(例如id
1
),查询customer-specific collection
例如:
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.
对数据的访问控制
我开始认为我的数据建模有点不正确,因为我在查询它时遇到了问题。
目前我拥有的是一堆客户(建模为每个客户的数据库) 这些客户有一堆设备: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
- 带customer id(例如id
1
),查询customer-specific collection
例如:
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.
对数据的访问控制