我正在使用 NodeJS、MongoDB 和 Mongoose 开发一个 Web 应用程序。它旨在充当用户和大数据环境之间的接口。这个想法是用户可以在一个单独的集群中执行大数据过程,并将结果存储在一个 MongoDB 集合Results
中。此集合可为每位用户存储超过 100 万份文档。
此集合的文档架构在用户之间可能完全不同。例如,我们有user1
和user2
。和Results
集合中的文档示例:user1
user2
{
user: ObjectId(user1):, // reference to user1 in the Users collection
inputFields: {variable1: 3, ...},
outputFields: { result1: 504.75 , ...}
}
{
user: ObjectId(user2):,
inputFields: {country: US, ...},
outputFields: { cost: 14354.45, ...}
}
我在 Web 应用程序中实现了一个搜索引擎,以便每个用户都可以根据他们的文档模式在字段中进行过滤(例如,user1
我必须能够通过inputFields.variable1
和user2
by进行过滤outputFields.cost
)。当然我知道我必须使用索引,否则查询会很慢。
我的第一次尝试是为Results
集合中的每个不同字段创建一个索引,但是效率很低,因为由于索引的大小,数据库服务器变得不稳定。所以我的第二次尝试是尝试通过使用部分索引来减少索引的数量,以便我在选项中创建指定用户 ID 的索引partialFilterExpression
。
问题是,如果另一个用户在Results
集合中与任何其他用户具有相同的架构,并且我尝试为该用户创建索引,MongoDB 会抛出此异常:
Index with pattern: { inputFields.country: 1 } already exists with different options
发生这种情况是因为部分索引无法索引相同的字段,即使它们partialFilterExpression
不同。
所以我的问题是:我怎样才能让用户在这个环境中有效地查询他们的结果?MongoDB真的适合这个用例吗?
谢谢