擅长:python、mysql、java
<blockquote>
<p>I'm wondering if there is a more pythonic or mongorific way of doing this though?</p>
</blockquote>
<p>是的,有。寻找<a href="http://docs.mongodb.org/manual/aggregation/" rel="nofollow">MongoDB Aggregation Framework</a>。Pymongo集合有一个<code>aggregate</code>方法,用于尝试执行的操作类型(<strong>请参阅update</strong>)。你知道吗</p>
<blockquote>
<p>I'm also curious at what point the $in isn't the way to go, if ever.</p>
</blockquote>
<p>嗯,我不完全确定<code>$in</code>,但我认为您可以将数据放在那里,直到达到BSON文档大小限制,即16兆字节。无论如何,我建议不要接近这个限制,因为它可能会减慢您的应用程序和MongoDB服务器的速度。你知道吗</p>
<p><strong>更新</p>
<p>聚合无助于解决潜在的大问题。<code>find</code>使用的相同查询将位于聚合管道的<code>$match</code>操作符中,因此应用相同的限制。你知道吗</p>
<p>如果您检测到<code>wantedIDs</code>的列表太大,那么您可以做的一件事就是根本不按<code>serial_id</code>进行筛选,这可能是因为它会达到BSON限制,也可能是因为它会导致MongoDB扫描几乎整个集合。你知道吗</p>
<p>您还可以在MongoDB中执行单个聚合,将树id的整个映射引入到应用程序中,然后在Python代码中进行匹配。聚合的结果也不能超过BSON的最大文档大小。如果集合变化不大,则可以尝试缓存聚合结果以提高性能。你知道吗</p>
<p>当然,所有这些都可能是过早的优化。如果不知道收集/申请的细节,就很难判断。你知道吗</p>
<p>除此之外,如果不重新考虑应用程序或重新构造数据以完全避免<code>$in</code>,就没有什么可以做的了。你知道吗</p>