nosql - mongoDB的排序问题
大家讲道理
大家讲道理 2017-04-21 10:56:29
0
4
765

有一个List ArrayList<Long> al=new ArrayList<Long>();里面存储了从外部获取的数据的ID并且进行了排序(随机抽取的ID,按照先后放入LIST),然后把这些ID在mongoDB通过inObj.put("_id", new BasicDBObject("$in", list));进行in查询,获取后的结果并不和LIST中ID的顺序一样,搜索了一下,有文章说不指定排序的话,mongodb会按照$natural进行排序,但是我测试了一下,并不是这样。
现在问题是怎么才能让mongodb按照list的排序获取结果呢

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

membalas semua(4)
伊谢尔伦

Ini soalan yang bagus. Sebenarnya, artikel yang anda semak tidak salah Jika anda tidak menyatakan pesanan, ia disusun mengikut susunan semula jadi. Tetapi pengisihan semula jadi ini merujuk kepada pengisihan mengikut pengisihan semula jadi _id. list anda hanyalah syarat pertanyaan, yang bersamaan dengan julat pertanyaan yang ditentukan oleh x > max AND x < min Ia tidak ada kaitan dengan pengisihan Tidak kira sistem pangkalan data itu, ia akan mencari data dalam julat list anda tentukan sebelum menekan Isih mengikut kaedah pengisihannya sendiri.

Cadangan saya ialah anda masih mendapat nilai dengan cara ini Selepas mengeluarkannya, gelungkannya melalui program java sendiri, dan kemudian habiskan tatasusunan yang diisih.

伊谢尔伦

Pernyataan @joyqi tidak betul Pengisihan semulajadi dalam MongoDB (iaitu, pengisihan mengikut medan $natural) adalah berbeza daripada pengisihan mengikut medan _id. Pengisihan semula jadi adalah berdasarkan susunan data dalam fail data.

Anda boleh menerangkan pertanyaan anda dan melihat cara ia menggunakan indeks Contohnya, jika anda menggunakan pernyataan berikut untuk memasukkan data:

> db.test.insert({a:2,b:1})
> db.test.insert({a:1,b:2})
> db.test.insert({a:2,b:3})
> db.test.insert({a:1,b:4})

Apabila anda tidak mengindeks medan a, anda akan mendapat keputusan berikut Berikut adalah hasil pengisihan semula jadi:

> db.test.find({a:{$in:[1,2]}})
{ "_id" : ObjectId("4f509380ea72116cb2137567"), "a" : 2, "b" : 1 }
{ "_id" : ObjectId("4f509380ea72116cb2137568"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("4f509380ea72116cb2137569"), "a" : 2, "b" : 3 }
{ "_id" : ObjectId("4f509380ea72116cb213756a"), "a" : 1, "b" : 4 }

Oleh kerana MongoDB ialah pertanyaan berperingkat pada masa ini, jika sekeping data diimbas dan memenuhi syarat, ia akan ditambahkan pada senarai pulangan. Jadi ia dilakukan dalam susunan semula jadi.

Dan jika anda menambah indeks dan menyemak semula, anda akan mendapat hasil berikut

> db.test.ensureIndex({a:1})
> db.test.find({a:{$in:[1,2]}})
{ "_id" : ObjectId("4f509537ea72116cb213756f"), "a" : 1, "b" : 4 }
{ "_id" : ObjectId("4f509530ea72116cb213756d"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("4f509534ea72116cb213756e"), "a" : 2, "b" : 3 }
{ "_id" : ObjectId("4f50952cea72116cb213756c"), "a" : 2, "b" : 1 }

Seperti yang anda lihat, keputusan dipisahkan mengikut makhluk 1 dan makhluk 2, kerana apabila membuat pertanyaan mengikut indeks, ia bersamaan dengan menyemak berbilang keping data dalam indeks Dalam contoh di sini, ia bersamaan dengan memeriksa bahawa julat a ialah [1, Data dalam dua julat 1] dan [2,2] secara logiknya periksa data [1,1], dan kemudian semak data [2,2 ], jadi di sini a ialah 1 Dipisahkan daripada 2.

伊谢尔伦

Saya tidak pernah menggunakan mongodb, tetapi saya merasakan jawapan kepada soalan ini adalah sama seperti pangkalan data hubungan yang lain. Jika anda memasukkan ID seperti ini dalam pangkalan data hubungan, dan ID ialah kunci utama, pangkalan data secara automatik akan mengisih mengikut nilai ID, kerana kunci utama itu sendiri ialah indeks berkelompok. Ia adalah sangat mudah untuk mencapai kesan yang anda mahukan. Jangan jana ID itu sendiri, biarkan Mongodb menjana ID yang meningkat secara automatik, supaya pengisihan adalah berdasarkan nilai penambahan automatik ini semasa memasukkan, dan apabila anda membacanya, ia juga dibaca dalam susunan sisipan. .

左手右手慢动作

Cari dan beri kedudukan mereka!

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan