mongodb中的Array vs Map

时间:2019-01-07 09:09:09

标签: java mongodb mongodb-query

我们有一个复杂的结构,我们将其存储在mongo中,并对其进行了大量处理,并经常对其进行更新。

作为结构的一部分,有一个Map Map之类的东西 Map<Enum, Map<String, Object> data

这是保存在mongo中并进行更新的内容。

所以mongo中的结构类似于

"data" : {
        "Category" : {     // Value of the enum
            "Test" : {     // Name of the value to categorize data with
                "count" : 2, 
                "values" : [
                  "value-1",
                  "value-2",
                ]
            }
        }
    }

保持这种结构的动机是加快处理速度,因为我们需要大量查找才能将新数据添加到相同的CategoryName中,并且在mongo中进行了更新

现在很明显,当我们将来需要添加索引并进行复杂的查询时,这并不容易。

所以正在寻找将其更改为更可扩展的建议吗?

阅读此内容看起来就像一个结构,这种类型的东西会好得多

List<MyObject> data;

MyObject在哪里

Enum Category;
String Name;
int count;
List<String> values;

但是,由于我们要处理这些数据,因此在List中进行每次查找都比进行Map查找要慢得多。

有什么办法可以在mongo中使用数组类型的模式,但是我可以将Map保留在Java代码中以加快查找速度?

1 个答案:

答案 0 :(得分:0)

在mongodb中保持为数组并在Java中映射的唯一方法是在服务器端将其从数组转换为映射。 在我的工作中,我们通常会遇到很多类似情况。

我也建议您简化存储在mongodb db中的文档。尝试将数组值转换为单个文档。它将涉及很多冗余,但是您将获得更多的概念,简化索引并增强查询能力。 同样,在文档中增加数组会损害写入性能,因为它将连续重写所有内容以释放空间,因为文档空间是连续的。

观察给定的文档结构,似乎只有保留的有价值的数据实际上是值数组中的值。

因此,只需将数组分解成单个文档即可。

{
    value: 'value-1'
},
{
    value: 'value-2'
},
{
    value: 'value-3'
},

取决于您要针对它运行的查询,但是这样的结构将为您带来更多的性能提升和查询自由。

希望有帮助