我正在使用MongoDB数据库设计一个多租户架构模型,其中将有多个模型,例如Customer
,Todo
等,并且会有一个集合来存储所有不同的模型。
我无法找出对数据进行排序的最佳方法。
让我解释一下我的架构:
每个模型都有一个唯一的ID,例如
客户:cust123
Todo:todo123
每个模型的ID都将类似于此格式projectId:modelId:dynamicId
//Schema of Collection 'Test'
{
id: "projectId:modelId:random5digitId",
modelId: "modelId",
//Storing in key-value pair to ease out indexing process.
data:[
{
property: 'PROPERTY_NAME_1',
value: 'PROPERTY_VALUE_1'
},
{
property: 'PROPERTY_NAME_2',
value: 'PROPERTY_VALUE_2'
}
],
//Also storing its obj model.
dataObj:{
PROPERTY_NAME_1: PROPERTY_VALUE_1,
PROPERTY_NAME_2: PROPERTY_VALUE_2
}
}
//Example data for collection Customer
{
id: "project123:cust123:12345",
modelId: "cust123",
data:[
{
property: 'firstName',
value: 'Jon'
},
{
property: 'lastName',
value: 'Snow'
}
],
dataObj:{
firstName: 'Jon',
lastName: 'Snow'
}
}
//Indexing will be like
db.Test.createIndex({ modelId:1, data.property:1, data.value:1 });
问题
通过这种方式,我可以在 7-10毫秒平均响应时间内非常快速地搜索数据,但是无法找到必须执行排序的适当解决方案与where
查询一起使用。一种方法是使用可在一定程度上起作用的聚合,但是如果我的集合必须有超过一百万条记录,那么查询将需要3-5秒才能返回响应。
什么是解决此问题的完美解决方案?
partial Index可以解决这种问题。如果我手动在dataObj.firstName
中添加索引,它的局限性是什么。我可以为同一架构中的不同数据模型创建无限索引吗?
示例查询
db.Test.find({
modelId:"cust123",
data: { $elemMatch: { property: 'firstName', value: 'Jon' } }
}).limit(10).explain("executionStats")
//Response Time: 7-10 ms in 1 million records
//Adding a Sort by firstName in the same query
//Using Aggregation
db.Test.aggregate(
{
$match: {
modelId:"cust123",
data: { $elemMatch: { property: 'firstName', value: 'Jon' } }
}
},
{ $unwind: '$data' },
{
$match: {
'data.property': 'firstName'
}
},
{
$sort: {
'data.property.value': -1
}
},
{
$limit: 10
}
);
//Response time increased to 3-5 sec in this query