我有一组带有external-id
字段的文档,该字段已编入索引。我有来自外部的ID流,我想找到与数据库中的文档匹配的所有ID。我不关心数据库中的任何字段,只关心匹配的ID。这些进入的速度很快,因此效率很重要。
如果它影响启发式,我猜测实际匹配的比例会非常低。
解决方案1,逐个进行:
for x in external-ids-stream:
c = db.documents.count({"external-id": x})
if c > 0:
yield x
(请原谅伪代码。)
不会通过线路发送太多数据,但每次请求可能会产生大量开销。
解决方案2,块输入,$ in with projection
for xs-chunk in chunks(external-ids-stream):
docs = db.documents.find({"external-id": {"$in": xs-chunk}}, {"external-id"})
for doc in docs:
yield doc.xs-chunk
分成块,这可能会减少开销。
我猜测#2是两者中最好的,但考虑到我正在尝试实现一个非常具体的操作,即一个值与一个索引的交叉,我想知道是否有一个更具体和有效这样做的方法?
答案 0 :(得分:0)
如果您不关心文件数量 - 请不要计算,但findOne:
Comment.joins(:likes)
.select('comments.*, count(likes) as like_count')
.group('comments.id')
.order('like_count desc')
如果需要,请确保索引适合内存,分片。
没有太多开销,因为驱动程序在池中保持连接打开,另一方面,您可以从异步请求中受益,并行处理流。