最近的项目使用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的特性,不能作为依赖,现在只能通过代码层来实现了。
Saya boleh mengagak mengapa ada keputusan sedemikian:
Jika tiada indeks, maka
COLLSCAN
dilalui dalam urutan$natural
, jadi output juga disusun secara semula jadiJika terdapat indeks,
IXSCAN
akan dilakukan kekunci demi kekunci, dan kemudian dimasukkan ke dalam set hasil satu persatu, iaitu susunan yang anda mahukan.Dari perspektif pengaturcaraan, ini masuk akal. Tetapi tidak ada jaminan bahawa versi MongoDB akan datang akan mengekalkan tingkah laku ini.
Malah, kebanyakan pangkalan data akan mengembalikan hasil dalam susunan rawak apabila tiada pengisihan dinyatakan, iaitu susunan yang difikirkan oleh enjin adalah yang paling cekap. Jadi, walaupun pesanan yang paling cekap sekarang ialah pesanan yang anda mahukan, ini tidak bermakna ia akan sentiasa seperti itu pada masa hadapan. Jangan bergantung pada ciri ini, jika tidak, masalah yang sangat pelik dan sukar dikesan akan berlaku apabila versi tertentu dinaik taraf pada masa hadapan.
Cadangan peribadi:
Jika boleh, nyatakan pengisihan dalam susunan input untuk mendapatkan susunan keputusan yang betul.
Jika susunan input tidak dapat ditentukan, susun sendiri dalam atur cara.