2017-04-25 60 views
0

我有一组带有external-id字段的文档,已编制索引。我有一个来自外部的ID流,我想查找所有与数据库中的文档相匹配的ID。我不关心数据库中的任何字段,只是匹配的ID。这些进来的速度很快,所以效率很重要。查询Mongo索引中是否存在序列id索引值的最有效方法?

在情况下,它会影响启发,我猜,实际上做匹配的比例会非常低。

解决方案1,做一个接一个:

for x in external-ids-stream: 
    c = db.documents.count({"external-id": x}) 
    if c > 0: 
    yield x 

(对不起的伪代码)

不通过网络发送的数据太多,但可能有一个很大的开销每个请求。

溶液2,块输入,$与投影

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

如果你不关心的文件数 - 不计,但findOne

db.documents.findOne({"external-id": x}, {"_id":0, "external-id": 1}); 

确保在必要时指数装入内存,碎片。

没有太多的开销,驱动器仍然在游泳池开放连接,而在另一方面,你可以从异步请求,在并行处理数据流中获益。

+0

谢谢!我没有想过使用findOne。我会尝试一下。 – Joe

+1

我比较了两种方法,2000个查询(打到一半,一半未命中)在10批次,和'$ in'约为4.5倍速度更快。 – Joe