【发布时间】:2013-08-12 01:01:45
【问题描述】:
我有一个这样的收藏:
{
"_id" : ObjectId("51f4ad560364f5490ccebe26"),
"fiTpcs" : [
"uuid1",
"uuid2",
"uuid3",
"uuid4",
"uuid5"
],
"fiTpcsCnt" : 5
}
fiTpcs的列表很长,以后可以上百个。当我检索我的集合时,我想获得一个有限的 fiTpcs 列表,一次说 20 个,并发出单独的请求以从 fiTpcs 获取后续数据。我只是想确保当我有更多数据时查询不会变慢。有没有办法在mongodb中做到这一点?直到现在,我一直在做
db.userext.find({"_id" : ObjectId("51f4ad560364f5490ccebe26")}).pretty();
这总是让我得到完整的 fiTpcs 数组。我正在使用带有 Spring 的 java 驱动程序,使用 Spring/java 的解决方案也可以。请注意 - 如果解决方案需要 mongo 扫描整个 fiTpcs 数组,然后切片其中的一部分,它并没有真正增加任何性能优势,这不是我想要的。
【问题讨论】:
-
在您的 Java 驱动程序中查找 Skip 和 Limit,如果它没有使用索引,您需要创建一个以使其合理有效。
-
但是,如果你有一个巨大的数组中的所有数据,你应该看看
$slice。 -
Skip and Limit 在性能方面不好。检查stackoverflow.com/questions/5049992/mongodb-paging 和stackoverflow.com/questions/7228169/…。我可以使用基于范围的分页,但如何对子文档执行此操作?
-
刚刚看到另一个 question 的建议,可能在您的子文档上使用带有 $unwind 的聚合框架会起作用。
-
您在寻找什么样的性能?您是否有测试表明一种方法明显优于另一种方法?在许多情况下,您会发现在实施之前看似低性能的东西实际上在类似生产的环境中是完全可以接受的。
标签: mongodb