2016-01-21 2 views
0

У меня есть коллекция, полная таких документов.Расчет агрегации MongoDB на сбор

{ 
    "_id" : ObjectId("5696db8a049c1bb2ecaaa10f"), 
    "resultSets" : [ 
     { 
      "headers" : [ "A", "B" ], 
      "data" : [ 
       [ 0, 1 ] 
      ] 
     }, 

     { 
      "headers" : [ "C", "D" ], 
      "data" : [ 
       [ 2, 3 ] 
      ] 

     } 
    ] 
} 

Я хотел бы использовать агрегацию для проецирования этого документа как только.

{ C: 2, D: 3 } 

Просто интересно, какой лучший способ сделать это.

+0

Какую версию MongoDB вы используете? – chridam

+0

Я использую MongoDB Version 3.2 – Yolo49

ответ

0

Если вы используете MongoDB 3.2, то $arrayElemAt будет пройти долгий путь в получении желаемых результатов агрегации особенно занимающихся arrays.

Выполните следующую агрегацию трубопровод, который использует оператор в $arrayElemAt вернуть нужные значения в новых ключах:

var pipeline = [ 
    { 
     "$match": { "resultSets.headers": { "$in": [ "C", "D" ] } } 
    }, 
    { "$unwind": "$resultSets" }, 
    { 
     "$match": { "resultSets.headers": { "$in": [ "C", "D" ] } } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "C": { "$arrayElemAt": [ "$resultSets.data", 0 ] }, 
      "D": { "$arrayElemAt": [ "$resultSets.data", 1 ] } 
     } 
    } 
] 

db.collection.aggregate(pipeline); 
+0

Спасибо. Это было очень полезно. Если я хочу только сопоставлять определенные значения в моем массиве [C, D], есть ли другой оператор, который будет использовать кроме $ in. Например, нужно сопоставлять документы, где ТОЛЬКО [C, D] существуют в этом конкретном порядке. – Yolo49

+0

Причина в том, что у меня есть несколько массивов, которые являются [C, D, E, F], и я хочу только сопоставлять массивы, которые являются [C, D]. – Yolo49

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