2017-02-07 24 views
1

У меня есть некоторые данные, продукты, и они имеют значения атрибутов и id этого атрибута. Этикетки атрибутов находятся в одной коллекции, но с type: "attribute" вместо `type:" product ". Мне нужно присоединиться к ним, поэтому у меня есть продукты, включая метку атрибутов и их значений.

У меня есть очень простые выборочные данные ей: https://gist.github.com/flowl/632243bca8f2907a672f66920ea0f793

Моя агрегация выглядит следующим образом:

db.input.aggregate([ 
    { 
     $unwind: "$attributes" 
    }, 
    { 
     $lookup: { 
      from: "input", 
      localField: "attributes.id", 
      foreignField: "attributeId", 
      as: "attributeLabels" 
     } 
    }, 
    { 
     $match: { "output": { $ne: [] } } 
    }, 
    { 
     $group: { 
      _id: "$productId", 
      product: { "$first": "$$CURRENT"} 
     } 
    }, 
    { $group : { _id : "$product._id", data: { $push: "$$ROOT" } } } 
]); 

Проблема заключается в том, я хочу, чтобы переформатировать вывод из этого:

{ 
    "_id" : ObjectId("5899925339db9185f13432c4"), 
    "data" : [ 
     { 
      "_id" : 111, 
      "product" : { 
       "_id" : ObjectId("5899925339db9185f13432c4"), 
       "type" : "product", 
       "productId" : 111, 
       "attributes" : { 
        "id" : 1, 
        "value" : "L" 
       }, 
       "attributeLabels" : [ 
        { 
         "_id" : ObjectId("5899927539db9185f13432cb"), 
         "type" : "attribute", 
         "attributeId" : 1, 
         "label" : "Size" 
        } 
       ] 
      } 
     } 
    ] 
} 

На это:

{ 
    "_id" : ObjectId("5899925339db9185f13432c4"), 
    "type" : "product", 
    "productId" : 111, 
    "attributes" : [ 
     { 
      "_id" : ObjectId("5899927539db9185f13432cb"), 
      "type" : "attribute", 
      "attributeId" : 1, 
      "label" : "Size", 
      "value" : "L" 
     } 
    ] 
} 
+0

Какова ваша Монго дб версия? – Veeram

+0

@Veeram db.version() - 3.4.2 – DanFromGermany

ответ

1

Вы можете использовать приведенную ниже агрегацию.

Это заменит значение поля id в массиве attributes с использованием значения $lookUp.

Ответ не совсем аналогичен, но включает все значения атрибутов от product.

db.input.aggregate([{ 
    $unwind: "$attributes" 
}, { 
    $lookup: { 
     from: "input", 
     localField: "attributes.id", 
     foreignField: "attributeId", 
     as: "attributes.id" 
    } 
}, { 
    $match: { 
     "attributes.id": { 
      $ne: [] 
     } 
    } 
}, { 
    $unwind: "$attributes.id" 
}, { 
    $group: { 
     _id: "$_id", 
     type: { 
      "$first": "$type" 
     }, 
     productId: { 
      "$first": "$productId" 
     }, 
     attributes: { 
      "$push": "$attributes" 
     } 
    } 
}]); 

Образец ответа

{ 
    "_id": ObjectId("5899925339db9185f13432c4"), 
    "type": "product", 
    "productId": 111, 
    "attributes": [{ 
     "id": { 
      "_id": ObjectId("5899927539db9185f13432cb"), 
      "type": "attribute", 
      "attributeId": 1, 
      "label": "Size" 
     }, 
     "value": "L" 
    }] 
} 
+0

Это хорошо, но имеет 1 проблему: новый массив атрибутов заменяет исходный, а не объединяется. Среднее значение поля 'value' в атрибуте теряется. – DanFromGermany

+0

Обновленный ответ. – Veeram

+0

Первая $ группа с '" $ first ":" $$ CURRENT "' делает мой массив атрибутов только для одного элемента, а не для всех (например, у продукта 111 есть 2 атрибута), как я могу это исправить? – DanFromGermany