Maison > Questions et réponses > le corps du texte
最近的项目使用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的特性,不能作为依赖,现在只能通过代码层来实现了。
巴扎黑2017-05-02 09:20:43
Je peux deviner pourquoi il y a un tel résultat :
S'il n'y a pas d'index, alors COLLSCAN
est parcouru dans l'ordre de $natural
, donc la sortie est également naturellement triée
S'il y a un index, IXSCAN
sera effectué clé par clé, puis placé dans l'ensemble de résultats un par un, ce qui correspond à l'ordre souhaité.
Du point de vue de la programmation, cela a du sens. Mais rien ne garantit que les futures versions de MongoDB conserveront ce comportement.
En fait, la plupart des bases de données renverront les résultats dans un ordre aléatoire lorsqu'aucun tri n'est spécifié, ce qui est l'ordre que le moteur considère comme le plus efficace. Ainsi, même si la commande la plus efficace actuellement est exactement celle que vous souhaitez, cela ne signifie pas qu’elle le sera toujours à l’avenir. Ne comptez pas sur cette fonctionnalité, sinon des problèmes très étranges et difficiles à localiser se produiront lors de la mise à niveau future d'une certaine version.
Suggestion personnelle :
Si possible, spécifiez le tri dans l'ordre de saisie pour obtenir le bon ordre des résultats.
Si l'ordre de saisie ne peut pas être spécifié, triez-le vous-même dans le programme.