Как получить уникальный список из нескольких массивов в MongoDB - PullRequest
1 голос
/ 06 марта 2012

Допустим, у меня есть тысячи похожих записей в моем MongoDB

{
    "_id": "1",
    "data": {
        "people": [
            {
                "id": "234323432"
            },
            {
                "id": "44213126"
            },
            {
                "id": "1321452"
            }
        ],
        "guys": [
            {
                "id": "521452"
            },
            {
                "id": "92321452"
            }
        ]
    }
}

Я хочу получить идентификаторы всех людей и парней (из массивов) и сгруппировать их, чтобы получить только уникальный список из них.Это возможно сделать только в MongoDB?

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

В зависимости от того, что вы хотите, чтобы ваш вывод был, уменьшение карты, безусловно, путь. Вот простой пример, который возьмет ваши документы выше, выделит уникальные идентификаторы и посчитает их количество:

map = function() {
    this.data.people.forEach(function(id){
        emit(id, {count:1});
    });
    this.data.guys.forEach(function(id){
        emit(id, {count:1});
    });
};
reduce = function(key, values) {
  var total = 0;
  values.forEach(function(value) {
        total += value.count;
  });
  return {count: total};
};
db.test.mapReduce(map, reduce, {out: 'result'});

Если ваш набор данных был:

{ "_id" : 1, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 2, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 3, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }

Продолжительность:

db.test.mapReduce(map, reduce, {out: 'result'});

даст коллекцию с именем 'result', в которой есть следующее:

{ "_id" : { "id" : "1321452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "234323432" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "44213126" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "521452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "92321452" }, "value" : { "count" : 3 } }

Вы можете изложить вышеизложенное в том, как вы хотите представлять свои данные или что вы хотите с ними делать, но надеюсь, что это поможет вам на вашем пути.

2 голосов
/ 06 марта 2012

Я предлагаю вам погрузиться в MapReduce Монго:

http://www.mongodb.org/display/DOCS/MapReduce

0 голосов
/ 06 марта 2012

Вы можете объединить их на клиенте.В зависимости от того, какой язык вы используете, он может варьироваться от очень простого до простого.

...