【问题标题】:Filter data on the query or with Java stream?过滤查询中的数据还是使用 Java 流?
【发布时间】:2015-08-25 13:44:12
【问题描述】:

我有一个 Play 2.3.x Java 应用程序通过 Morphia 连接到 MongoDB 数据库。

我在 MongoDB 中激活了慢查询分析,发现查询经常出现。它看起来像这样:

"query": {
    "field1": null,
    "field2": true,
    "field3": "a061ee3f-c2be-477c-ad81-32f852b706b5",
    "$or": [
        {
            "field4.VAL.VALUE_1": "EXPECTED_VALUE_1",
            "field4.VAL.VALUE_2": "EXPECTED_VALUE_2"
        }
    ]
}

在当前状态下,没有索引,因此每次执行查询时都会扫描整个集合。我还有一些文档,但我预计数据库会增长。

所以我想知道最好的解决方案是什么:

  1. 从查询中删除以上所有子句,检索所有结果 (分页)并使用 Java Stream API 过滤
  2. 保持查询不变并索引字段

如果您看到其他解决方案,请随时提出建议 :)

谢谢。

【问题讨论】:

  • $or 数组中有一个对象——这有什么意义?
  • 你标记了一个点!因为在另一种情况下,我有几个对象。但是当我只有一个时我必须处理这种情况以避免这种无用的$or

标签: java performance mongodb java-stream morphia


【解决方案1】:

始终执行离数据源最近的一切可能的事情(过滤、排序等)。

您为什么没有为这些字段编制索引?这就是它们的意义所在。

【讨论】:

  • 好吧,但我想索引并不是那么神奇,创建大量索引会导致写入性能不佳?这就是为什么我想在做出决定之前先确定一下。我想这样的索引看起来像这样的复合索引:{ "field1" : 1, "field2" : 1, "field3" : 1, "field4" : 1 }?
  • 您可能应该阅读一些文档。现在你假设了很多事情。索引很神奇,它们确实会产生小的写入损失,但我没有说你应该创建 lots 的索引。在 Java 端读取所有数据和过滤只是说“我真的不知道如何使用我的数据库”。此外,您应该始终衡量性能以了解最佳解决方案。
  • 根据您的属性值的特殊性,索引field3 可能就足够了
猜你喜欢
  • 2013-12-13
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多