有一个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的排序获取结果呢
좋은 질문이네요. 사실, 확인하신 기사는 잘못된 것이 아닙니다. 순서를 지정하지 않으시면 자연스러운 순서에 따라 정리됩니다. 그런데 이 자연정렬이란
_id
의 자연정렬에 따른 정렬을 말한다.list
은x > max AND x < min
에 지정된 쿼리 범위와 동일한 쿼리 조건입니다. 이는 정렬과 관련이 없습니다. 어떤 데이터베이스 시스템이든list
범위 내의 데이터를 찾습니다. 자신의 정렬 방법으로 정렬을 누르기 전에 지정했습니다.제 제안은 값을 꺼낸 후 직접 Java 프로그램을 통해 루프를 실행한 다음 정렬된 배열을 실행하는 것입니다.
@joyqi의 진술은 완전히 옳지 않습니다. MongoDB의 자연 정렬(즉, $natural 필드를 기준으로 한 정렬)은 _id 필드를 기준으로 한 정렬과 다릅니다. 자연 정렬은 데이터 파일에서 데이터가 구성되는 순서를 기반으로 합니다.
쿼리를 설명하고 인덱스를 사용하는 방법을 확인할 수 있습니다. 예를 들어 다음 문을 사용하여 데이터를 삽입하는 경우
으아아아a 필드를 인덱싱하지 않으면 다음과 같은 결과가 나타납니다. 자연 정렬 결과는 다음과 같습니다.
으아아아MongoDB는 현재 순위 쿼리이기 때문에 데이터 조각을 스캔하여 조건을 만족하면 반환 목록에 추가됩니다. 그래서 그것은 자연스러운 순서로 이루어졌습니다.
그리고 index를 추가하고 다시 확인해 보면 다음과 같은 결과가 나옵니다
으아아아보시다시피 결과는 존재 1과 존재 2에 따라 구분됩니다. 왜냐하면 인덱스로 쿼리하는 것은 인덱스에 있는 여러 데이터를 확인하는 것과 동일하기 때문입니다. a의 범위가 [1인지 확인합니다. 1]과 [2,2]의 두 범위에 있는 데이터가 논리적으로 직렬인지 확인합니다. 먼저 [1,1]의 데이터를 확인한 다음 [2,2의 데이터를 확인합니다. ], 따라서 여기서 a는 2와 분리된 1입니다.
저는 mongodb를 사용해 본 적이 없지만 이 질문에 대한 답은 다른 관계형 데이터베이스와 동일하다고 생각합니다. 관계형 데이터베이스에 이와 같은 ID를 삽입하고, 그 ID가 기본 키라면, 기본 키 자체가 클러스터형 인덱스이기 때문에 데이터베이스는 자동으로 ID 값에 따라 정렬을 하게 됩니다. 원하는 효과를 직접 생성하지 말고 Mongodb에서 자동으로 증가하는 ID를 생성하도록 하여 삽입 시 이 자동 증가 값을 기준으로 정렬하고 읽을 때도 삽입된 순서대로 읽습니다. .
검색하고 순위를 매기세요!