我在产品系列中有两个文件:
{ _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,只是获取集合。
不幸的是,它返回了整个类别列表,不同的值,而不仅仅是匹配正则表达式的那些。
我做错了什么?
答案 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"}}
])