如何在MongoDB中使用具有不同架构的单个集合执行排序

时间:2018-07-21 04:22:26

标签: mongodb indexing mongoose database-design multi-tenant

我正在使用MongoDB数据库设计一个多租户架构模型,其中将有多个模型,例如CustomerTodo等,并且会有一个集合来存储所有不同的模型。

我无法找出对数据进行排序的最佳方法。

让我解释一下我的架构:

每个模型都有一个唯一的ID,例如

  1. 客户:cust123

  2. 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

0 个答案:

没有答案