在流星中处理“复杂”mongodb文档的好方法是什么?

时间:2013-01-27 02:05:01

标签: mongodb meteor

我想存储“carpool_debts”,它基本上会保留欠其他用户的天数。它看起来像这样:

carpool_debts{
              _id,
              owner,
              owner_id,
              creditors:[{name,
                          id,
                          amount},
                          {name,
                           id,
                           amount}
                        ]} 

这个数据结构对我想存储的内容是否合理?同样实现该数据结构似乎很难维护。我发现它很麻烦主要是因为流星中还没有可用的upsert类型的函数。而不是债权人是子文件清单,我最好将债权人存储为分隔字符串吗?我想知道我是走在正确的道路上还是我错过了什么?感谢。

2 个答案:

答案 0 :(得分:3)

您可以像在关系数据库中一样构建mongo文档,例如,为债权人和所有者设置单独的集合,并使用carpool_debts作为附加金额的链接表:

carpool_debts{
              _id,
              owner_id,
              creditor_id,
              amount}

creditors{
          _id,
          name}

owners{
       _id,
       name}

然而,这并没有充分发挥mongodb的潜力。特别是如果这是一个包含大量数据的数据库,您可能希望针对最常用的查询对其进行优化,否则会很慢。例如,为了优化查找所有者的债务,您可以在所有者集合中添加所需的数据,使用债权人的子文档,再次为个人债务添加子文档,类似于您已经完成的工作:

owners{
       _id,
       name,
       creditors: {id,
                   name,
                   debts: {
                           amount,
                           due_date}
                  }
      }
同样,如果您经常查看债权人的未偿债务,请在债权人收款中加上债务信息:

creditors{
          _id,
          name,
          debtors: {
                    owner_id,
                    owner_name, 
                    debts: { 
                             aount,
                             due_date
                           }
                   }
         }

这样,您只需查找一条记录即可获得所需的所有信息。当然,有捕获量。首先,这不是很干,但那是故意的。但是你必须记住在发生变化时更新其他表。例如,如果您更改债权人的名称,则需要更新与该债权人有债务的每个所有者凭证(确保将其编入索引)。这当然会使更新速度变得更慢(并且数据库更大),但是如果你不经常更新,并且经常查找,这不会成为问题。 此外,如果债权人可以拥有数千个单独的未偿还债务,您可能必须将其分成链接表,或者更确切地说,链接集合,如此,所以您不要超过mongodb的最大文档大小:

creditors{
          _id,
          name,
         }

debtors: {
           owner_id,
           creditor_id, 
           debts: { 
                    amount,
                    due_date
                  }
          }

然后,每个债权人 - 所有者连接都有一个文档。这意味着在查看债权人时要查找更多文档,但仍然只能查找所有者。

答案 1 :(得分:1)

这看起来不错,但您也可以考虑将债权人分成自己的集合,并在债务集合中存储一个债权人数组。这将降低复杂性并使查找和过滤信息更容易。而且如果与同一债权人有多笔债务,则会更加干涸,您只能将债权人存放在一个地方。

您还可以考虑将债务集合中的每个单据都归一个债权人所有者单一债务。那么你只需要id,owner_id和creditor_id - 就像关系数据库中的链接表一样。