MongoDB $in 쿼리에 대한 응답 순서?
$in 조건부 연산자의 MongoDB 문서에는 순서에 대한 내용이 없습니다.양식 쿼리를 실행하는 경우
db.things.find({'_id': {'$in': id_array}});
반환된 결과의 순서는 무엇입니까?그리고 MongoDB에 "나는 그 결과들이 에 있는 ids와 같은 순서로 정렬되기를 원한다.id_array
?"
JIRA에 대한 이 기능에 대한 질문:
빠르게 꽤 좋은 반응을 얻었습니다: 사용$or
대신에$in
c.find( { _id:{ $in:[ 1, 2, 0 ] } } ).toArray()
대.
c.find( { $or:[ { _id:1 }, { _id:2 }, { _id:0 } ] } ).toArray()
자세한 내용은 버그 보고서를 참조하십시오.
업데이트:
$ 또는 해결 방법 해킹은 2.6.x부터 더 이상 작동하지 않습니다. 이는 변경된 구현의 부작용이었습니다.
저도 같은 문제를 겪었고, 제 해결책은 제 ID 배열(내 쿼리)과 MongoDB의 결과 배열 간의 매핑을 수행하는 해시 맵을 만드는 것이었습니다.
추가 작업은 결과 배열을 탐색하고 각 항목에 대해 새 키-값 쌍을 삽입하는 것입니다. 키는 ID이고 값은 결과 개체입니다.
그런 다음 쿼리와 동일한 순서로 결과를 탐색하고 싶을 때 해시 맵을 사용하여 올바른 개체를 검색할 수 있습니다.정렬도 없고 고급 Mongo DB 옵션도 없습니다.
Javascript에서는 다음과 같습니다.
//The order you want
var queryIds = [ 8, 5, 3, 7 ];
//The results from MongoDB in an undefined order
var resultsFromMongoDB = [
{_id: 7, data: "d" },
{_id: 8, data: "a" },
{_id: 5, data: "b" },
{_id: 3, data: "c" },
];
//The function to create a hashmap to do the mapping
function createHashOfResults( results ){
var hash = {};
for( var i = 0 ; i < results.length ; i++ ){
var item = results[i];
var id = item._id;
hash[ id ] = item;
}
return hash;
}
//Let's build the hashmap
var hash = createHashOfResults( resultsFromMongoDB );
//Now we can display the results in the order we want
for( var i = 0 ; i < queryIds.length ; i++ ){
var queryId = queryIds[i];
var result = hash[queryId];
console.log( result.data );
}
다음과 같이 표시됩니다.
a
b
c
d
@제이슨의 대답은 정확합니다.
기타 답변 정보:심각한 성능 문제가 발생할 수 있기 때문에 일일이 조회하는 것은 권장하지 않습니다.
@Jason의 답변 외에도 다음과 같은 Array.reduce 및 Array.map 메서드를 사용하여 최적화할 수 있습니다.
//The order you want
var queryIds = [8, 5, 3, 7];
//The results from MongoDB in an undefined order
var resultsFromMongoDB = [
{_id: 7, data: "d"},
{_id: 8, data: "a"},
{_id: 5, data: "b"},
{_id: 3, data: "c"}
];
var reorderedResults = naturalOrderResults(resultsFromMongoDB, queryIds);
function naturalOrderResults(resultsFromMongoDB, queryIds) {
//Let's build the hashmap
var hashOfResults = resultsFromMongoDB.reduce(function (prev, curr) {
prev[curr._id] = curr;
return prev;
}, {});
return queryIds.map( function(id) { return hashOfResults[id] } );
}
결과의 순서는 신뢰할 수 있는 방식으로 정렬되지 않기 때문에 언급되지 않습니다.주문을 받는 유일한 방법은 $in 배열의 각 항목에 대해 클라이언트 측에서 별도의 쿼리를 수행하는 것입니다.
Underscore.js를 사용해도 괜찮으며 규모에 대해 너무 걱정하지 않으신다면 (IE, 괜찮으시다면)fetch
- 커서로 작업하는 것이 아니라 -ing), 순서를 유지한 방법은 다음과 같습니다.
var results = db.things.find({'_id': {'$in': id_array}}).fetch();
return _.sortBy(results, function(thing) {
return id_array.indexOf(thing._id);
});
$or 해결 방법은 2.6.x에서 더 이상 작동하지 않습니다. https://jira.mongodb.org/browse/SERVER-14083 을 참조하십시오.다음은 Ruby의 해결 방법 구현입니다. https://gist.github.com/dblock/d5ed835f0147467a6a27
언급URL : https://stackoverflow.com/questions/3142260/order-of-responses-to-mongodb-in-query
'programing' 카테고리의 다른 글
Angular 2에서 제출한 후 양식을 지우는 방법은 무엇입니까? (0) | 2023.05.27 |
---|---|
외래 키 제약 조건을 도입하면 주기 또는 다중 캐스케이드 경로가 발생할 수 있습니다. 그 이유는 무엇입니까? (0) | 2023.05.27 |
여러 Git 커밋을 되돌리려면 어떻게 해야 합니까? (0) | 2023.05.27 |
WPF 응용 프로그램에서 FolderBrowserDialog 사용 (0) | 2023.05.27 |
객체 배열에 속성 추가 (0) | 2023.05.27 |