MongoDB: получение списка значений с помощью группы - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть коллекция под названием contract, и я бы хотел group using "a_id"

{
 a_id: 1,
 "name": "n1"
}
{
 a_id: 2,
 "name": "n2"
}
{
 a_id: 1,
 "name": "n3"
}
{
 a_id: 1,
 "name": "n4"
}
{
 a_id: 2,
 "name": "n5"
}

Я хочу group by "a_id", чтобы показать мне список связанных имен.

{
 a_id: 1,
 values: ["n1", "n3", "n4"]
}
{
 a_id: 2,
 values: ["n2", "n5"]
}

Мой код:

db.contract.group({ 
      key:{a_id: 1}, 
      initial: {v: ''}, 
      reduce: function(doc, obj){ 
            v = v + " " + obj.name
      } 
}); 

Мой вывод:

{
        "a_id" : 1,
        "v" : ""
    },
    {
        "asset_id" : 2,
        "v" : ""
    }

Это не возвращает список значений, но mongd logs показывает мне список имен. Как я могу это исправить?

Исправлено

db.contract.group({
   key:{a_id: 1}, 
   initial: {v: []}, 
   reduce: function(obj, prev){ 
      prev.v.push(obj.name)
   }
});

Ответы [ 2 ]

9 голосов
/ 07 августа 2012

Вы также можете использовать Framework агрегирования MongoDB :

Следующее будет работать точно так же:

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $push: '$name'}}})

Следующее будет помещать каждое уникальное значение только один раз в набор результатов (в случае, если в 'a_id' есть дублированные имена):

db.contract.aggregate({$group: { '_id': '$a_id', 'name': { $addToSet: '$name'}}})
1 голос
/ 17 ноября 2011

Исправлено

db.contract.group({
   key:{a_id: 1}, 
   initial: {v: []}, 
   reduce: function(obj, prev){ 
      prev.v.push(obj.name)
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...