最近的项目使用mongo作为数据库,遇到了一个问题。
db.col_content.find({'nodeID':{$in:[d,c,b,a]}})
使用这样的查询的时候,查询的结果是按照自然排序的,即:
{a.....},
{b.....},
{c.....},
{d.....},
不是在传值的时候的{d,c,b,a};
我的猜测是,$in的操作是按照自然排序遍历数据,依次跟$in里面的数据进行比较,所以才会最终的数据按照自然排序,但是现在的业务需求需要按照传值的顺序,难道只能代码层实现排序了吗?
我用的是PHP,不知道有没有比较简单的方法来进行排序。
请指教。
刚才看到另外一个类似的问题,如果有在nodeID上加索引的话,就会根据$in的传值进行查询。我去试一试。
加了索引之后确实按照传入顺序进行排序了,但是楼下已经有人说了,这个是mongo的特性,不能作为依赖,现在只能通过代码层来实现了。
なぜそのような結果になるのかは推測できます:
インデックスがない場合、
COLLSCAN
は$natural
の順序で走査されるため、出力される内容も自然な順序になりますCOLLSCAN
是按$natural
顺序遍历的,所以出来的也是自然排序;如果有索引,则会逐个key做
。IXSCAN
IXSCAN
はキーごとに実行され、希望する順序で 1 つずつ結果セットに追加されます。
プログラミングの観点から見ると、これは理にかなっています。ただし、MongoDB の将来のバージョンでもこの動作が維持されるという保証はありません。実際、ほとんどのデータベースは、並べ替えが指定されていない場合、結果をランダムな順序で返します。これは、エンジンが最も効率的であると考える順序です。したがって、現時点で最も効率的な順序がまさに希望どおりであるとしても、将来も常にそのようになるとは限りません。この機能に依存しないでください。そうしないと、将来特定のバージョンがアップグレードされるときに、非常に奇妙で特定が困難な問題が発生する可能性があります。- 個人的な提案:
- 可能であれば、正しい結果の順序を取得するために、入力順序に従って並べ替え順序を指定します。
入力順序を指定できない場合は、プログラム内で自分で並び替えてください。 🎜🎜 🎜