2013-02-01 4 views
3

에서 $로 $ 정렬이 나는 $in 운영자와 MongoDB를 find 쿼리를 실행하고 있습니다 : [name1, name2, ...] : 내 이름 배열과 동일한 순서로 정렬되는 결과 싶습니다MongoDB를 :

collection.find({name: {$in: [name1, name2, ...]}}) 

. 이것을 어떻게 성취합니까?

참고 : pongongo를 통해 MongoDb에 액세스하고 있지만 그다지 중요하지 않다고 생각합니다.

편집 : 그것은 MongoDB를에 기본적으로이를 달성하는 것은 불가능하다, 나는 전형적인 파이썬 솔루션을 사용하여 종료 :

names = [name1, name2, ...] 
results = list(collection.find({"name": {"$in": names}})) 
results.sort(key=lambda x: names.index(x["name"])) 
+0

당신이 레코드를 원하는 뜻을 포함 할 것이다 먼저 name1을 포함하고 name2를 포함하는 레코드가 뒤에 오는가? – paulmelnikow

+0

네, 맞습니다. 현재의 경우 이름은 고유하지만 관련이 없습니다. 그렇습니까? –

+0

이것은 일반적인 쿼리를 통해 현재 가능하지 않습니다. – Sammaye

답변

2

불가능합니다. $ 연산자가 존재를 확인합니다. 목록은 설정된 것으로 처리됩니다.

옵션 :

  • name1에 대한 몇 가지 쿼리에 대한 분할 ... nameN 또는 결과 같은 방법으로 필터링 할 수 있습니다. 더 많은 이름 - 더 많은 검색어.
  • itertools groupby/ifilter를 사용하십시오. 이 경우 모든 문서에 "우선 순위 정렬"플래그를 추가하고 name1을 PREC1에, name2를 PREC2에 대응 시키십시오. 그런 다음 PREC에 의해 정렬 한 다음 PREC별로 그룹화하십시오.

컬렉션에 "이름"입력란에 색인이있는 경우 - 옵션 1이 좋습니다. 인덱스가 없거나 쓰기/읽기 비율이 높아서 만들 수없는 경우 - 옵션 2가 적합합니다.

1

비탈리는 발견으로 그렇게하는 것은 불가능 정확하지만 집계 달성 할 수 있습니다

db.collection.aggregate([ { $match: { name: {$in: [name1, name2, ...]} }, { $project: { 'name': 1, 'name1': { $eq: [ 'name1', '$name' ] }, 'name2': { $eq: [ 'name2', '$name' ] } } }, { $sort: { 'name1': 1, 'name2': 1 } } ])

내가이 오른쪽에 다른 사람의 힌트를 희망 2.6.5

테스트 방향.

1

다음 버전 3.4 (2016 년 11 월)부터는 집계 프레임 워크를 사용하여이를 달성 할 수 있습니다. 당신이 원하는 순서를 가정

는 배열 order=["David", "Charlie", "Tess"]이 파이프 라인을 통해 작업을 수행합니다

m = { "$match" : { "name" : { "$in" : order } } }; 
a = { "$addFields" : { "__order" : { "$indexOfArray" : [ order, "$name" ] } } }; 
s = { "$sort" : { "__order" : 1 } }; 
db.collection.aggregate(m, a, s); 

"$addFields" 단계는 3.4에서 새로 추가하고 다른 모든 모른 채 기존 문서에 "$project" 새로운 분야에 당신을 수 있습니다 기존 필드. 새로운 "$indexOfArray" 표현식은 주어진 배열에서 특정 원소의 위치를 ​​반환합니다.

이 집계의 결과는 입력 배열 order에 지정된 순서대로, 당신의 상태와 일치하는 문서가 될 것이며, 문서는 모든 원본 필드, 플러스라는 추가 필드 __order