2017-05-05 2 views
2

VoyageMongo Query에 대한 반환 필드를 제한 할 수있는 가능성을 찾고 있습니다. 필자는 필드가있는 db.person을 가지고 있다고 가정합니다 (personId, firstName, lastName). Mongo에서
db.persons.find({ }, {'personId' : 1})
VoyageMongo에서 모든 사전 항목을 JSON 쿼리로 보내는 것은 $ 및 쿼리로 대조됩니다. MongoQuery에는 instVar와 Accessors to fields가 있지만, 어떻게 설정해야할지 모르겠습니다. VoyageMongo에서 반환 필드를 지정하는 방법이 있습니까? 내가 찾은 유일한 옵션 클래스, VOMongoRepository, VOMongoRepositoryResolver 및 MongoCollection을 확장했다 동안 검색 한 후VoyageMongo에 반환 할 입력란을 지정하십시오.

감사

최대

답변

0

. 제가
Class>>selectMany: aBlock options: someOptions ^self voyageRepository selectMany: self where: aBlock options: someOptions VOMongoRepository>>selectMany: aClass where: aDictionary options: someOptions | selected | selected := resolver selectMany: aClass where: aDictionary options: someOptions. ^aClass = aClass persistentClass ifTrue: [ selected ] ifFalse: [ selected select: [ :each | each isKindOf: aClass ] ] VOMongoRepositoryResolver>>selectMany: aClass where: aDictionary options: someOptions self execute: [ ^self basicSelectMany: aClass where: aDictionary options: someOptions ] VOMongoRepositoryResolver>>basicSelectMany: aClass where: aDictionary options: someOptions "Selecting instances of aClass should be done in the mongo query, not here" self flag: #todo. ^((self basicRawSelectMany: aClass where: aDictionary options: someOptions) collect: [ :each | self retrieveObjectOf: aClass json: each ] as: repository collectionClass) select: [ :each | each isKindOf: aClass ] VOMongoRepositoryResolver>>basicRawSelectMany: aClass where: aDictionary options: someOptions ^self pool withDatabase: [ :db | (self collectionAt: aClass inDatabase: db) select: aDictionary options: someOptions ] MongoCollection>>select: aDictionary options: someOptions ^self query: [:query | query where: aDictionary; limit: (someOptions at: 'limit' ifAbsent: nil); offset: (someOptions at: 'offset' ifAbsent: nil); fields: (someOptions at: 'fields' ifAbsent: nil) ]

있는 메시지 사슬을 첨가 이러한 문제를 해결했다. 메시지는 그 방식으로 전송된다

options := { 'fields' -> { 'personId' -> 1 } asDictionary } asDictionary. 
^ self selectMany: [ :each | 
    (each at: 'name') = 'Max' ] 
    options: options 

하나는 제한을 추가하고 옵션 디렉토리에의 오프셋 (offset) 할 수 있습니다. 많은 필드가있는 개체가 있으므로 그 중 일부만 가져 오는 경우의 성능이 48000 ms에서 229 ms로 변경되었습니다.
확장명을 가진 패키지를 만들었습니다.