2015-03-05 5 views
0

У меня есть коллекция с документами, похожую наСоздание массива из двух полеев

{ 
    "senderName" : "John", 
    "receiverName" : "Doe" 
} 

Я пытаюсь выполнить операцию агрегирования по сбору, где я хотел бы иметь набор имен (который сочетает в себе как senderName и receiverName

так, что у меня есть что-то вроде

names:["John", "Doe"] 

есть ли способ для достижения этой цели с Монго агрегации F ramework. Кроме того, я, к сожалению, застрял с mongo 2.4 для решения этой проблемы.

ответ

1

В современных выпусках MongoDB наиболее эффективным способом является простое обозначение нового поля как массива. Это позволило с MongoDB 3,2:

db.collection.aggregate([ 
    { "$project": { 
    "names": [ "$senderName", "$receiverName" ] 
    }} 
]) 

Вероятно, самый простой способ сделать это с нами, используя $map оператор, введенный в MongoDB 2.6. Он преобразует массивы так это то, что вы в принципе сделать:

db.collection.aggregate([ 
    { "$project": { 
     "names": { "$map": { 
      "input": { "$literal": ["first","last"] }, 
      "as": "el", 
      "in": { "$cond": [ 
       { "$eq": [ "$$el", "first" ] }, 
       "$senderName", 
       "$receiverName" 
      ]} 
     }} 
    }} 
]) 

В качестве альтернативы вы можете сделать подобный процесс с более ранними версиями, которые не поддерживают оператора, но не очень эффективно:

db.collection.aggregate([ 
    { "$project": { 
     "senderName": 1, 
     "receiverName": 1, 
     "type": { "$const": [ "first", "last" ] } 
    }}, 
    { "$unwind": "$type" }, 
    { "$group": { 
     "_id": "$_id", 
     "names": { "$push": { "$cond": [ 
      { "$eq": [ "$type", "first" ] }, 
      "$senderName", 
      "$receiverName" 
     ]}} 
    }} 
]) 

Но так в любом случае вы на самом деле не агрегируете что-либо, это справедливый аргумент для использования аналогичного подхода map в клиентском коде с помощью вашей собственной поддержки для этого языка. Но если вам нужно использовать его на каком-то этапе вашей агрегации, тогда вам нужно это сделать.

Вы все еще можете это сделать, и это так.