2012-11-28 4 views
0

PyMongo을 사용하여 MongoDB에서 데이터를 가져옵니다. 컬렉션의 모든 문서는 아래의 구조처럼 : 나는 재산 language.value이 재산 actor.languages 내부입니다 모든 대화를 가져 오기 위해 노력하고있어기존 값이있는 MongoDB 선택

{ 
    "_id" : ObjectId("50755d055a953d6e7b1699b6"), 
    "actor": 
    { 
     "languages": ["nl"] 
    }, 
    "language": 
    { 
     "value": "nl" 
    } 
} 

. 순간

나는 ( actor.languages 내부 도중 와 예. 모든 대화) actor.languages 내부에 일정한 값으로 모든 대화 찾는 방법을 알고있다.

하지만 현재의 문서에서 변수 값 (language.value)을 사용하여 동일한 비교를 수행하는 방법에 대해 고민하고 있습니다.

도움이 필요하시면 미리 감사드립니다.

답변

1
db.testcoll.find({$where:"this.actor.languages.indexOf(this.language.value) >= 0"}) 
+1

나는 모든 문서가 같은 구조를 가지고 있지 않기 때문에''actor.languages ​​': {'$ exists ': True}'와 ''language ': {'$ exists ': True}를 추가해야했습니다. 감사합니다! – Voles

1

당신은 $where를 사용할 수는 쿼리 세트가 작지만 제공되는 실제 크기와이 쿼리는 페이지와 JS에서 실시간으로 실행해야 하나처럼 보인다 특히 이후, 문제를보고 시작할 수 엔진은 다른 문제들 중에서도 하나의 스레드입니다.

실제로이 경우 클라이언트 쪽을 통해 더 나은 방법을 고려해 볼 수 있습니다. 이는 매우 간단합니다. 값 중 하나를 기반으로 레코드를 추출하고 반복적으로 조건부 이중 값을 테스트합니다 (즉, language.value을 기반으로합니다. nl이고 이전 값에 대한 actor.languages 값을 테스트하십시오.)

나는 당신이 집계 프레임 워크에서 이것을 할 수있을 것이라고 생각하지만, 분당 $match 내에 계산 된 필드를 사용할 수 없다. 나는 그것이 다음과 같이 보일 것이라고 상상한다.

{$project: 
    {languages_value: "$language.value", languages: "$actor.languages"} 
}, {$match: {"$languages": {$in:"$languages_values"}} 

가능하다면. 그러나 방법이있을 수 있습니다.

+0

현재 우리 데이터베이스에는 약 1200000 개의 문서가 있습니다. 지금은 '어디에서'할 것입니까? 집계 프레임 워크에 대해 몰랐는데 지금 당장 체크 아웃하십시오. 당신의 도움을 주셔서 감사합니다! – Voles

+1

@Voles'$ where'는 좋은 시간 안에 1.2m 문서를 결코 만들지 않을 것입니다. 쿼리를 10x 씩 속도를 늦추고 사람들은 그것을 사용하는 동안 초당 약 67k 문서를 보았고 인덱스를 사용하지 않기 때문에 $ exist 절을 추가 했으므로이 필드가있는 모든 1.2m 또는 모두를 스캔하십시오. 그러나 그것이 작동하는 것을 발견한다면 그걸로 붙어 요 :) – Sammaye

+0

지금은 작동하지만'$ where'를 사용하는 것이 좋지 않습니다. 귀하의 제안을 고려하여 시스템이 느려지는 경우이를 구현할 것입니다. 다시 한 번 감사드립니다! – Voles

관련 문제