Как вернуть значения вариантов каждого продукта, если этот продукт является вариантом?

#javascript #node.js #mongodb #aggregation-framework

#javascript #node.js #mongodb #агрегация-фреймворк

Вопрос:

У меня есть база данных в MongoDB, подобная этой

 {"productId" : 1,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
        {
            "name" : "Capacity",
            "value" : "500 GB",
            "id" : 3
        }, 
        {
            "name" : "Form Factor",
            "value" : "5 inch",
            "id" : 4
        }, 
        {
            "id" : 5,
            "name" : "Memory Components",
            "value" : "3D NAND"
        }
    ]
},
{"productId" : 2,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
        {
            "name" : "Capacity",
            "value" : "1 TB",
            "id" : 3
        }, 
        {
            "name" : "Form Factor",
            "value" : "5 inch",
            "id" : 4
        }, 
        {
            "id" : 5,
            "name" : "Memory Components",
            "value" : "3D NAND"
        }
    ]
},
{"productId" : 3,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
        {
            "name" : "Capacity",
            "value" : "500 GB",
            "id" : 3
        }, 
        {
            "name" : "Form Factor",
            "value" : "2.5 inch",
            "id" : 4
        }, 
        {
            "id" : 5,
            "name" : "Memory Components",
            "value" : "3D NAND"
        }
    ]
},
{"productId" : 4,
"isVariant": 1,
"variantId" : 1,
"attributeSet" : [ 
        {
            "name" : "Capacity",
            "value" : "1 TB",
            "id" : 3
        }, 
        {
            "name" : "Form Factor",
            "value" : "2.5 inch",
            "id" : 4
        }, 
        {
            "id" : 5,
            "name" : "Memory Components",
            "value" : "3D NAND"
        }
    ]
}
 

Теперь я хочу вернуть данные, где 500 ГБ было в productId 1 и 3
Ответ должен быть таким:

 variantValues : [{
attributeValue : "500 GB",
data : [
  {productId : 1},
  {productId : 3}
]},
{
attributeValue : "1 TB",
data : [
  {productId : 2},
  {productId : 4}
]},
{
attributeValue : "2.5 inch",
data : [
  {productId : 3},
  {productId : 4}
]},
{
attributeValue : "5 inch",
data : [
  {productId : 1},
  {productId : 2}
]}]
 

У меня есть возможные значения, которые я сохраняю в другой коллекции variantPossible значений. Значения, которые я сохраняю, выглядят следующим образом:

 "VariantValues" : {
        "3" : [ 
            "500 GB", 
            "1 TB"
        ],
        "4" : [ 
            "2.5 inch", 
            "5 inch"
        ]
    },
 

Я хочу вернуть значения вариантов каждого продукта, если этот продукт является вариантом с указанным выше форматом. кто-нибудь может мне помочь с этим.

Ответ №1:

Вы должны быть в состоянии достичь этого, используя $unwind и $group в вашем конвейере агрегации. Сначала каждый атрибут объединяется в один документ, и для них вы можете группировать по значению атрибута.

Наконец, вы можете использовать $project , чтобы получить желаемое имя для attributeValue :

 db.collection.aggregate([
  {
    $unwind: "$attributeSet"
  },
  {
    $group: {
      _id: "$attributeSet.value",
      data: {
        "$addToSet": {
          productId: "$productId"
        }
      }
    }
  },
  {
    "$project": {
      _id: 0,
      data: 1,
      attributeValue: "$_id"
    }
  }
])
 

Смотрите этот упрощенный пример на mongoplayground: https://mongoplayground.net/p/VASadZnDedc