Укажите поля для возврата в VoyageMongo

Я ищу возможность ограничить поля возврата для запроса VoyageMongo. Предполагается, что у меня есть db.persons с полями (personId, firstName, lastName). В Монго я могу запросить
db.persons.find( { }, {'personId' : 1} )
В VoyageMongo кажется, что все записи Словаря, отправленные в JSON-запрос, объединены в $ и запрос. В MongoQuery есть instVar и Accessors для полей, но я не знаю, как их настроить. Есть ли способ указать поля возврата в VoyageMongo?

С уважением

Максимум

1 ответ

После поиска в течение некоторого времени единственной возможностью, которую я нашел, было расширение Class, VOMongoRepository, VOMongoRepositoryResolver и MongoCollection. Я добавил цепочку сообщений с
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

Можно также добавить предел и смещение в каталог опций. Поскольку у меня есть объекты со многими полями, производительность при выборке только нескольких из них изменилась с 48000 мс до 229 мс
Я создал пакет с расширением.

Другие вопросы по тегам