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

有一个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的排序获取结果呢

大家讲道理
大家讲道理

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

모든 응답(4)
伊谢尔伦

좋은 질문이네요. 사실, 확인하신 기사는 잘못된 것이 아닙니다. 순서를 지정하지 않으시면 자연스러운 순서에 따라 정리됩니다. 그런데 이 자연정렬이란 _id의 자연정렬에 따른 정렬을 말한다. listx > 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를 생성하도록 하여 삽입 시 이 자동 증가 값을 기준으로 정렬하고 읽을 때도 삽입된 순서대로 읽습니다. .

左手右手慢动作

검색하고 순위를 매기세요!

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿