Maison > Questions et réponses > le corps du texte
有一个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的排序获取结果呢
伊谢尔伦2017-04-21 10:58:29
C'est une excellente question. En fait, l'article que vous avez vérifié n'est pas faux. Si vous ne précisez pas l'ordre, il est classé selon l'ordre naturel. Mais ce tri naturel fait référence au tri selon le tri naturel des _id
. Votre list
n'est qu'une condition de requête, qui équivaut à une plage de requête spécifiée par x > max AND x < min
. Cela n'a rien à voir avec le tri. Quel que soit le système de base de données, il trouvera les données dans la plage list
. que vous avez spécifié avant d'appuyer sur Trier selon sa propre méthode de tri.
Ma suggestion est que vous obteniez toujours la valeur de cette manière. Après l'avoir retirée, parcourez-la vous-même dans le programme Java, puis exécutez le tableau trié.
伊谢尔伦2017-04-21 10:58:29
La déclaration de @joyqi n'est pas tout à fait exacte. Le tri naturel dans MongoDB (c'est-à-dire le tri par le champ $natural) est différent du tri par le champ _id. Le tri naturel est basé sur l'ordre dans lequel les données sont organisées dans le fichier de données.
Vous pouvez expliquer votre requête et voir comment elle utilise l'index. Par exemple, si vous utilisez l'instruction suivante pour insérer des données :
> 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})
Lorsque vous n'indexez pas le champ a, vous obtiendrez les résultats suivants. Ce qui suit est le résultat d'un tri naturel :
> 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 }
Étant donné que MongoDB est actuellement une requête classée, si une donnée est analysée et remplit les conditions, elle sera ajoutée à la liste de retour. Cela se fait donc dans l'ordre naturel.
Et si vous ajoutez l'index et vérifiez à nouveau, vous obtiendrez les résultats suivants
> 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 }
Comme vous pouvez le voir, les résultats sont séparés selon un être 1 et un être 2, car lors d'une requête par index, cela équivaut à vérifier plusieurs données dans l'index. Dans l'exemple ici, cela équivaut à. vérifier que la plage de a est [1, les données dans les deux plages de 1] et [2,2] sont logiquement en série. Vérifiez d'abord les données de [1,1], puis vérifiez les données de [2,2. ], donc ici a est 1 Séparé de 2.
伊谢尔伦2017-04-21 10:58:29
Je n'ai jamais utilisé mongodb, mais j'estime que la réponse à cette question est la même que celle des autres bases de données relationnelles. Si vous insérez un ID comme celui-ci dans une base de données relationnelle et que l'ID est la clé primaire, la base de données triera automatiquement en fonction de la valeur de l'ID, car la clé primaire elle-même est un index clusterisé. Il est très simple d'y parvenir. l'effet souhaité. Ne le générez pas vous-même. ID, laissez Mongodb générer un ID à incrémentation automatique, afin que le tri soit basé sur cette valeur à incrémentation automatique lors de l'insertion, et lorsque vous le lisez, il est également lu dans l'ordre d'insertion. .