Background

如果我能将其归结为一个简单的模拟,那么这将是一个集合与较少的客户文档(如Java)之间的区别:

class Customer {
    private String name;
    private Address address;
    // each CreditCard has hundreds of Payment instances
    private Set<CreditCard> creditCards;
}

或者一个有很多很多付款文件的集合,比如:

class Payment {
    private Customer customer;
    private CreditCard creditCard;
    private Date payDate;
    private float payAmount;
}

Question

我环顾了很多地方,但我没有偶然发现任何MongoDB模式最佳实践可以帮助我回答我的问题.

推荐答案

您肯定需要针对正在进行的查询进行优化.

根据你的描述,这是我最好的猜测.

您可能想知道每个客户的所有信用卡,所以在Customer对象中保留一个信用卡array.您可能还希望每次付款都有一个客户参考.这将使付款凭证相对较小.

付款对象将自动拥有自己的ID和索引.您可能还需要在客户参考上添加索引.

这将允许您快速按客户搜索付款,而无需每次存储整个客户对象.

如果你想回答像"What was the average amount all customers paid last month"这样的问题,你需要的是一个针对任何大型数据集的map/reduce.你不会得到"实时"的回应.您会发现,存储对客户的"引用"对于这些映射来说可能已经足够好了.

所以直接回答你的问题:Is MongoDB designed to prefer many, many small documents or fewer large documents?

MongoDB旨在快速查找索引项.MongoDB非常擅长大海捞针.MongoDB非常擅长大海捞针.因此,围绕最常见的用例构建数据,并为更罕见的用例编写映射/减少作业(job).

Mongodb相关问答推荐

geoLocation或geoNear为坐标和半径使用let变量

Select 筛选聚合中的嵌套字段

MongoDB $lookup 查找字段值数组

当日期和时间在不同键的字符串中时,Mongo 查询过滤今天的数据

Golang 无法在 MongoDB 中创建文档

在 MongoDB 中加入多个集合

通过 _id 更新一个文档(无效的 BSON 字段名称 _id)

$eq 的目的是什么

mongoDB vs mySQL - 为什么在某些方面比另一个更好

如何在 Mongoose 中定义一个通用的嵌套对象

如何在 Mongo 聚合管道中获取限制之前的计数

Mongodb将重音字符匹配为基础字符

在 MongoDb 中查询小于 NOW 的日期时间值

使用 brew upgrade Mongo update from 3.4 to 4.0 报错:在try 升级到 4.0 之前,数据文件需要完全升级到 3.6 版

$elemMatch 的 MongoDB 索引

MongoDB - 投影一个并不总是存在的字段

如何在 mongoDB 中聚合巨大的数组?

MongoDB count() 未定义

查找聚合性能差

如何使用 Spring 的 MongoTemplate 和 Query 类检索字段子集?