1

Я использую mongotemplate, моя коллекция выглядеть следующим образом:агрегация mongotemplate с уникальными результатами

{ 
    "_id": "theid", 
    "tag": "taga", 
    "somefield": "some value", 
    "fieldC": { 
     "anotherfielad": "more data", 
     "an_array": [ 
      { 
       "a": "abc", 
       "b": 5 
      }, 
      { 
       "a": "bca", 
       "b": 44 
      }, 
      { 
       "a": "ddd", 
       "b": 21 
      } 
     ] 
    } 
} 

{ 
    "_id": "anotherid", 
    "tag": "taga", 
    "somefield": "some other value", 
    "fieldC": { 
     "anotherfielad": "other more data", 
     "an_array": [ 
      { 
       "a": "ccc", 
       "b": 6 
      }, 
      { 
       "a": "abc", 
       "b": 99 
      }, 
      { 
       "a": "ddd", 
       "b": 21 
      } 
     ] 
    } 
} 

Мне нужно, чтобы получить уникальный результат от $ fieldC.an_array.a в этом случае: («ABC», "ДСС", "дДД", "ссс")

этот запрос работает:

[ 
    { 
     "$match": { 
      "tag": "taga" 
     } 
    }, 
    { 
     "$unwind": "fieldC.an_array" 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "array": { 
       "$addToSet": "fieldC.an_array.a" 
      } 
     } 
    } 
] 

но как это сделать с помощью mongotemplate?

ответ

0

Я не думаю, что это лучший способ, но вы можете добиться этого с:

DBObject unwind = new BasicDBObject(
    "$unwind", "fieldC.an_array" 
); 
DBObject match = new BasicDBObject(
    "$match", new BasicDBObject(
     "tag", "taga" 
    ) 
); 
DBObject group = new BasicDBObject("$group", JSON.parse(
    "{ 
     '_id': null, 
     'array': { 
      '$addToSet': 'fieldC.an_array.a' 
     } 
    }" 
)); 
AggregationOutput output = mongoTemplate.getCollection("collectionName").aggregate(unwind, match, group); 

if (output.results().iterator().hasNext()) { 
    DBObject obj = (DBObject) output.results().iterator().next().get("array"); 
} 
Смежные вопросы