Mongodb QueryBy Пример findOne

Какой-то другой процесс вставляет документы в коллекцию Монго, и ниже приведены примеры данных

{ "_id" : ObjectId("597b89c8da52380b04ee6948"), "_class" : "com.test.mongo", "clientId" : "CAQ123999", "isValid" : false, "isParent" : true }
{ "_id" : ObjectId("597b89c8da52380b04ee6949"), "_class" : "com.test.mongo", "clientId" : "CAQ123999", "isValid" : false, "isParent" : true }
{ "_id" : ObjectId("597b89c8da52380b04ee6950"), "_class" : "com.test.mongo", "clientId" : "CAQ123998", "isValid" : true, "isParent" : true }
{ "_id" : ObjectId("597b89c8da52380b04ee6951"), "_class" : "com.test.mongo", "clientId" : "CAQ123997", "isValid" : true, "isParent" : false }

Я пытаюсь получить одну запись для clientId, используя QueryByExampleExecutor.

Вот моя модель

package com.test.cfp.model;
public class TFSModel {

    private String clientId;
    private boolean isValid;
    private boolean isParent;
    ...

}

Вот код для построения примера:

TFSModel tfs = new TFSModel();
            tfs.setClientId(CAQ123999);
            tfs.setValid(false);
            tfs.setParent(true);    
            ExampleMatcher matcher =ExampleMatcher.matching().withIgnoreNullValues().withIgnorePaths("_id","_class");
            Example<TFSModel > example = Example.of(tfs,matcher);           
            TFSModel oneTfsRecord  = tflsRepository.findOne(example);

Это не работает, ниже сгенерированный запрос

findOne using query: { "isValid" : false , "isParent" : true , "clientId" : "CAQ123999" , "_class" : { "$in" : [ "com.test.cfp.model.TFSModel"]}} in db.collection: returns.tfs;

Очевидно, класс _class отличается от пакета в коллекции mongo. Как я могу сказать Монго построить запрос без _class. Я пробовал withIgnoredPaths, и он не работает.

1 ответ

Решение

MongoExampleMapper проверяет тип зонда и записывает ограничения типа в соответствии с известными типами в MappingContext, Типы, присваиваемые зонду, включаются в $in оператор.

class One {
    @Id String id;
    String value;
    // ... 
}

class Two extends One {
    // ...
}

One probe = new One();
probe.value = "firefight";

Example<One> example = Example.of(probe, ExampleMatcher.matchingAny());
{
    value: firefight,
    _class: { $in : [ "com.example.One" , "com.example.Two" ] }
}

Это поведение не может быть изменено с помощью .withIgnorePaths() как _class спецификатор не является частью модели предметной области. Пожалуйста, отправьте вопрос в jira.spring.io, если вы считаете, что это следует рассмотреть.

Глядя на предоставленные образцы данных из коллекции монго, которую вы предоставили _class атрибут не соответствует типу вашего домена и поэтому не может быть загружен.

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