使用Spring MongoDB进行反向正则表达式选择

时间:2017-07-04 07:04:21

标签: java regex spring mongodb spring-data-mongodb

我有一个mongo集合,其中包含以下对象:

[
{
    "_id" : "a2d",
    "entityType" : "Location",
    "type" : "STRING",
},
{
    "_id" : "a1_order",
    "entityType" : "Order",
    "type" : "STRING",
}
]

尝试将_entityType附加到所有文档的id,其末尾不存在id(上述情况中的第一个对象)。

在Spring中使用mongo,但我已经坚持第一步,获取id中没有entityType的所有对象。

用正则表达式思考这样的事情,但我不确定它应该是什么样子:

Query query = new Query();
query.addCriteria( Criteria.where( "id" ).regex( "here i need the entity type of the current document" ) );

2 个答案:

答案 0 :(得分:2)

您可以通过' ^ '构建正则表达式(''正则表达式开头)。

因此,您需要一个指向所有文档并检查此过滤器的函数

    List<Document> result = new ArrayList<Document>();
    StringBuilder idPrefix = new StringBuilder();
    idPrefix.append("^");
    idPrefix.append(idCode);
    idPrefix.append("_");
    List<Bson> filters = new ArrayList<Bson>();
    filters.add(Filters.regex("_id", keyPrefix.toString()));
    for (Document d : yourCollections.find(Filters.and(filters)))
        list.add(d);

答案 1 :(得分:1)

你真的想在这里使用“反向正则表达式”,因为你需要使用文档中的数据才能匹配另一个字段。

目前,您只能使用$where对MongoDB执行此操作,该BasicQuery会评估服务器上的JavaScript。因此,对于spring mongo,您需要使用refer,因此我们可以从BasicDBObjectCode灵长来源构建:

    BasicDBObject basicDBObject = new BasicDBObject("$where",
            new Code("!RegExp('_' + this.entityType + '$','i').test(this.id)"));

    BasicQuery query = new BasicQuery(basicDBObject);

这将测试文档中的"id"字段,以查看它是否与“字符串末尾”entityType中的值匹配,而不考虑“大小写”。 !Not条件,因此逻辑的“反向”应用于“不匹配”,其中字段实际上以此方式结束。