Укажите поля для возврата в 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 мс
Я создал пакет с расширением.