通过mongodb中的morphia对类中对象列表进行字段访问

Sad*_*mar 0 entity field mongodb morphia

使用morphia POJO映射器在mongodb中实现过滤器时遇到一些问题.

在我的类中(例如SampleClass),当我尝试访问@Entity类的字段时(在我们的例子中Person),我发现字段访问工作正常,使用点符号表示一般字段,如int,string,maps或直接嵌入对象.

问题是我无法理解它如何适用于Person类中引用的"对象列表"的情况.(假设在这里,一个人可以有很多地址,所以这个Person类有一个addresses包含Address对象列表的字段)

@Entity
Class Person
{
    String name;
    int age;
    String type;
    private Map<String, String> personalInfo= new HashMap<String, String>();
    @Reference
    List<Address> addresses = new ArrayList<Address>;
}

@Entity
Class Address
{
    String streetName;
    int doorNo;
}
Run Code Online (Sandbox Code Playgroud)

例如,我想对List streetName中的Address对象应用过滤器addresses

public class SampleClass
{  
    private Datastore ds;
    Query<Node>              query;
    CriteriaContainer        container;

    // connections params etc....
    public List<Person> sampleMethod()
    {
        query = ds.find( Person.class ).field( "type" ).equal( "GOOD");                              

        container.add( query.criteria( "name" ).containsIgnoreCase("jo" ));   
        // general String field in the Person Class ---- OKAY, Work's Fine

        container.add( query.criteria( "personalInfo.telephone" ).containsIgnoreCase( "458" ) ); 
        // Map field in the Person Class, accessing telephone key value in the map --- OKAY, Work's Fine

        container.add( query.criteria( "addresses.streetname").containsIgnoreCase( "mainstreet" ) ); 
        // List of address object in the Person Class, name of the field is 'addresses'
        // ----NOT OKAY   ????????? -- Here is the problem it returns nothing, even though some value exists

        return readTopography( query.asList() );
    }
}
Run Code Online (Sandbox Code Playgroud)

我在访问列表中的对象时是否做错了什么?

Sad*_*mar 5

"addresses"字段是@Reference,我们不能将"addresses.name"用作条件中的字段.它应该是一个标准,其中地址字段位于"List <Key <Address >>>"中:

    Query<Person> personQuery = ds.createQuery(Person.class);
    Query<Address> addressQuery = ds.createQuery(Address.class);
    addressQuery.criteria("streetName").containsIgnoreCase("mainstreet");
    container.add(personQuery.criteria("addresses").in(addressQuery.asKeyList()));

    System.out.println(personQuery.asList());
Run Code Online (Sandbox Code Playgroud)

问候,悲伤