MongoDb Spring在嵌套对象中查找

时间:2015-12-01 09:04:44

标签: java regex spring mongodb spring-data

我正在使用Spring Data Mongodb和这样的文档:

{
    "_id" : ObjectId("565c5ed433a140520cdedd7f"),
    "attributes" : {
        "565c5ed433a140520cdedd73" : "333563851"
    },
    "listId" : ObjectId("565c57aaf316d71fd4e4d0a0"),
    "international" : false,
    "countryCode" : 33,
    "deleted" : false
}

我想查询我的集合来搜索属性对象中的值(在值而不是键中)。

例如:

@Query("{'listId': ?0, $or: [{'attributes.*':{$regex: ?1}}], 'deleted':false}")
Page<PTContact> findByListIdAndByAttributesContaining(ObjectId listId, String val, Pageable pageable);

但我不确定能够做到这一点。有什么好主意帮我吗?

祝你好运

编辑:我的解决方案

嗯,我做的很简单。我知道listId的每个id(属性字段中的键),所以我创建了一个自定义mongopération

    Criteria[] fieldsCriteria = new Criteria[fields.size()];
    for (int i = 0; i < fields.size(); i++) {
        fieldsCriteria[i] = Criteria.where("attributes." + fields.get(i).getId()).regex(val, "i");
    }
    Query query = Query.query(Criteria.where("listId").is(listId).orOperator(fieldsCriteria));
    return new PageImpl<>(operations.find(query.with(pageable), PTContact.class), pageable, operations.count(query, PTContact.class));

有一些分页.. 它的工作原理

1 个答案:

答案 0 :(得分:1)

我认为您必须更改attributes的结构:

attributes : [{
        key : "565c5ed433a140520cdedd73",
        value: "333563851"
    }, {
        key : "...",
        value: "..."
    }
]

然后改变你的请求:

{'attributes.value': ?1}