我有一个数据模型,其中每个产品有许多变体,每个变体有许多修改。在数据库中,它看起来像这样:
const mods = db.modifications.insertMany([
{
title: 'Modification #1',
image: 'img1.png',
},
{
title: 'Modification #2',
image: 'img2.png',
},
{
title: 'Modification #3',
image: 'img3.png',
},
])
db.products.insertOne({
slug: 'product1',
title: 'Product #1',
variants: [
{
size: 20,
price: 200,
modifications: [
{ id: mods.insertedIds[0], price: 10 },
{ id: mods.insertedIds[1], price: 15 },
],
},
{
size: 30,
price: 250,
modifications: [
{ id: mods.insertedIds[0], price: 15 },
{ id: mods.insertedIds[2], price: 20 },
],
},
],
})
字符串
https://mongoplayground.net/p/6jmEv2Q2aZO
我想做的是
db.products.aggregate([
{ $match: { slug: 'product1' } },
// ?
])
型
得到这样的结果
{
slug: 'product1',
title: 'Product #1',
variants: [
{
size: 20,
price: 200,
modifications: [
{ _id: '…', title: 'Modification #1', image: '…', price: 10 },
{ _id: '…', title: 'Modification #2', image: '…', price: 15 },
],
},
{
size: 30,
price: 250,
modifications: [
{ _id: '…', title: 'Modification #2', image: '…', price: 15 },
{ _id: '…', title: 'Modification #3', image: '…', price: 20 },
],
},
],
}
型
如何在MongoDB中实现?
我尝试了两次$unwind
,然后$lookup
db.products.aggregate([
{ $match: { slug: 'product1' } },
{ $unwind: '$variants' },
{ $unwind: '$variants.modifications' },
{
$lookup: {
from: 'modifications',
localField: 'variants.modifications.id',
foreignField: '_id',
let: { price: '$variants.modifications.price' },
pipeline: [{ $addFields: { price: '$$price' } }],
as: 'modifications',
},
},
])
型
但不知道如何将$group
(?)数据返回。
还有a similar question with the working solution,在我的例子中,modifications
数组不仅仅是一个id数组,它的元素(price
字段)中有数据,我需要以某种方式将其包含在结果中。
1条答案
按热度按时间4szc88ey1#
您可以在没有
$unwind
阶段的情况下实现。$match
个$lookup
-从 modifications 集合中获取匹配的文档,其中_id
位于扁平化的modIds
(variants.modifications.id)
)中,并输出为modifications
数组。$set
-设置variants
字段。3.1.
$map
-通过合并当前v
(变量)对象和结果中的对象来迭代variants
数组 3.1.1。3.1.1.
$map
-通过迭代modifications
数组,合并当前m
(修改)对象和结果中的对象,对象包含modifications
数组 3.1.1.1。3.1.1.1.
$first
-从结果中获取第一个匹配元素 3.1.1.1.1.3.1.1.1.1.
$filter
-使用m.id
从(根)modifications
数组中筛选匹配文档。$unset
-删除“modifications”和“variants.modifications.id“字段。字符串
Demo @ Mongo Playground