2015-02-02 2 views
1

몇 가지 예제와 튜토리얼을 검색해 보았지만 사례에 대한 명확한 예제를 찾을 수 없습니다.PouchDB에서 중첩 된 개체 쿼리

var heroes = [ 
{ 
    id: 5, 
    name: 'Batman', 
    realName: 'Bruce Wayne', 
    equipments: [ 
     { 
      type: 'boomarang', 
      name: 'Batarang', 
     }, 

     { 
      type: 'cloak', 
      name: 'Bat Cloak', 
     }, 

     { 
      type: 'bolas', 
      name: 'Bat-Bolas', 
     }  
    ] 
}, 
{ 
    id: 6, 
    name: 'Cat Woman', 
    realName: 'Selina Kyle', 
    equipments: [ 
     { 
      type: 'car', 
      name: 'Cat-illac', 
     }, 

     { 
      type: 'bolas', 
      name: 'Cat-Bolas', 
     }  
    ] 
} 
]; 

내가 예를 들어 쿼리 싶습니다 : "올가미의 장비 유형 영웅을 얻을"그리고 그것은 배열의 두 영웅 개체를 반환해야

는이 같은 내 서버에서 JSON 응답을 얻을 .

나는 그것이 옳지 않다 알고 있지만 내가 뭘하려고이 같은지도 기능을 형성하는 것입니다

function myMapFunction(doc) { 

    if(doc.equipments.length > 0) { 
     emit(doc.equipment.type);  
    } 

} 

db.query(myMapFunction, { 
    key: 'bolas', 
    include_docs: true 
}).then(function(result) { 
    console.log(result); 
}).catch(function(err) { 
    // handle errors 
}); 

그것이 가능을? 내가 가진 대안이 없다면?

P.S : LokiJS 및 underscoreDB도 확인했습니다. 그러나 PouchDB는 더 정교 해 보이며 그러한 쿼리를 수행 할 수 있습니다.

답변

1

지도 기능이 있어야한다 사전에 너희들을 감사합니다

function myMapFunction(doc) { 
    doc.equipments.forEach(function (equipment) { 
    emit(equipment.type); 
    }); 
} 

그런 다음 쿼리, 당신이 {key: 'bolas'}를 사용

db.query(myMapFunction, { 
    key: 'bolas', 
    include_docs: true 
}).then(function (result) { 
    // got result 
}); 

그런 다음 결과를 볼 것이다 like :

{ 
    "total_rows": 5, 
    "offset": 0, 
    "rows": [ 
    { 
     "doc": ..., 
     "key": "bolas", 
     "id": ..., 
     "value": null 
    }, 
    { 
     "doc": ..., 
     "key": "bolas", 
     "id": ..., 
     "value": null 
    } 
    ] 
} 

색인을 먼저 만들어야합니다. 세부 사항은 PouchDB map/reduce guide입니다.

+0

고맙습니다. Nolan. 나는 또한 PouchDB =에 대한 12 가지 팁에 대한 귀하의 블로그를 읽을 것입니다. –

+0

또한 "항상 allDocs()"를 사용하여 달성 할 수 있다면 "항상 자신에게 물어보십시오"라는 것을 읽습니다. 이 경우 가능합니까? 내가 너에게 묻는 것은 나 자신에게하지는 않지만 ... –

+0

모든 수퍼 히어로가 여러 개의 무기를 가질 수 있기 때문에이 경우 가능하지 않을 것이다. 무기가 하나뿐이라면 그렇습니다. :) – nlawson