2017-01-27 5 views
1

я следующее:Монго объединить в массив

{_id: blah, anotherId: "externalId", description: "foo"}, 
{_id: blah, anotherId: "externalId", description: "bar"}, 
... 

Я хочу:

{_id: blah, anotherId: "externalId", descriptions: ["foo", "bar"]} 

Я знаю, что могу просто написать это, но это очень медленно, так как у меня есть миллионы записей.

db.collectionOfAnotherId.find().forEach(function(r){ 
    var x = {anotherId: r.id, descriptions: []}; 
    db.myCollection.find({anotherId: x.anotherId}).forEach(function(d){ 
     x.descriptions.push(d.description); }); 
     db.newCollection.save(x); 
    }) 

Любые идеи?

+0

I Я боюсь, что вам придется идти вперед с идеей, что вы уже имеете в виду. Для любой СУБД было бы сложно предоставить такое средство. –

+0

Если значение этого описания было массивом с самого начала, тогда у вас мог бы быть коллективный массив со всеми уникальными элементами, но ... –

+0

Да, если бы были продуманы только оригинальные данные :) – Mika

ответ

1

Для этого можно использовать структуру агрегации. Например, рассмотреть вопрос об использовании $lookup оператора, чтобы сделать левый присоединиться к myCollection и записи результатов следующего $group трубопровода в новой коллекции с помощью $push для создания массива описаний как:

db.collectionOfAnotherId.aggregate([ 
    { 
     "$lookup": { 
      "from": "myCollection", 
      "localField": "id", 
      "foreignField": "anotherId", 
      "as": "d" 
     } 
    }, 
    { "$unwind": "$d" }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "anotherId": { "$first": "$id" }, 
      "descriptions": { "$push": "$d.description" } 
     } 
    }, 
    { "$out": "newCollection" } 
]) 
+0

Beautiful! Как вы думаете, это будет быстрее, чем моя простая функция. Не будет ли также повторять эти данные по крайней мере в два раза? – Mika

+0

Это может быть быстрее, я не знаю, но с инфраструктурой агрегации он предназначен для повышения производительности, и это довольно легко проверить, так что попробуйте и посмотрите, как это тарифицируется. – chridam

Смежные вопросы