Java + MongoDB中数组字段的不同值

时间:2014-12-22 16:54:19

标签: java regex mongodb mongodb-java morphia

我在产品系列中有两个文件:

{ _id: '123', name:'tv abc', categories:['electronics','promo','cellbattery'] },
{ _id: '124', name:'phone xyz', categories:['electronics','sim','cellphones','promo'] }

我希望我的用户输入搜索输入文本字段'el'并获取此列表:

['electronics','cellbattery','cellphones']

我写了这个查询:

DBCollection collection = getDatastore().getCollection(Products.class);
        DBObject query = new BasicDBObject( "categories", Pattern.compile(queryTerm) );
        return collection.distinct( "categories", query );

其中queryTerm为'el',第一行来自Morphia,只是获取集合。

不幸的是,它返回了整个类别列表,不同的值,而不仅仅是匹配正则表达式的那些。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

当数组元素满足find / distinct中指定的查询条件时,将返回整个文档, NOT 只返回匹配的数组元素。要实现您的目标,您需要使用aggregation framework。我在下面提供了Mongo查询,可以在shell中执行。这应该可以帮助你用Java重写它。

db.Products.aggregate([
    // Match only those documents that have atleast one category satisfying regex `/el/`
    {$match: {categories: /el/}}, 
    // De-normalize the 'categories' array
    {$unwind: "$categories"}, 
    // Get only those array elements matching regex '/el/'
    {$match: {categories: /el/}}, 
    // Group by the array elements to get distinct value
    {$group: {_id: "$categories"}}
])