【问题标题】:Mongodb QueryByExample findOneMongodb QueryByExample findOne
【发布时间】:2017-07-28 19:53:17
【问题描述】:

其他一些进程将文档插入到 mongo 集合中,下面是示例数据

{ "_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 }

我正在尝试使用 QueryByExampleExecutor 为 clientId 获取一条记录。

这是我的模型

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 集合中的包不同。我如何告诉 mongo 在没有 _class 的情况下构建查询。我尝试了 IgnoredPaths,但它不起作用。

【问题讨论】:

    标签: java mongodb spring-data query-by-example


    【解决方案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 属性的 mongo 集合中提供的示例数据与您的域类型不匹配,因此无法加载。

    【讨论】:

    • 感谢@Christoph Strobl。我最终使用了 MongoTemplate。我不确定这是否是有效的场景。无论如何,我会尝试将其记录在 jira.spring.io 中。
    猜你喜欢
    • 2015-10-12
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多