gpt4 book ai didi

node.js - 具有多个条件的聚合和基于计数键的总和匹配

转载 作者:行者123 更新时间:2023-12-04 08:37:25 25 4
gpt4 key购买 nike

我试图获取另一个集合中对象数组中存在的元素计数。
例子:
集合 A:

{
_id:1,
name:"Sample1"
}
{
_id:2,
name:"Sample 2"
}
{
_id:3,
"name":"Sample 3"
}
{
_id:4,
"name":"Sample 4"
}
集合 B:
{
_id:11,
items:[ {_id:1, name:"sample1",size:1},{_id:3, name:"sample 3",size:5}]
}
{
_id:12,
items:[ {_id:1, name:"sample1",size:2},{_id:3, name:"sample 3",size:6}]
}
{
_id:13,
items:[ {_id:2, name:"sample2", size:5},{_id:1, name:"sample 1",size:8}],
is_delete:true
}
{
_id:14,
items:[ {_id:1, name:"sample1",size:3},{_id:3, name:"sample 3",size:1}]
}

注意:items 中的_id 是字符串。
预期输出:
{
_id:1,
name:"Sample1",
count:6
}
{
_id:2,
name:"Sample 2",
count:0
}
{
_id:3,
"name":"Sample 3",
"count":12
}
{
_id:4,
"name":"Sample 4",
"count":0
}
请帮我写一个 mongo 查询以获得预期的输出。

最佳答案

由于有两个集合,我们需要使用

  • $lookup加入两个集合。这里我用了 uncorelated subqueries
  • 聚合在 colA 中执行集合,但在 lookup 内的 pipeline我们在 colB 上执行聚合. $unwind有助于解构 items . $match有助于消除不需要的数据(匹配阶段需要 $expr)。
  • 一旦我们的加入成功,我们只需要使用 $size 来计算数组。
  • $reduce有助于求和 size 的数组值

  • 下面给出了 mongo 脚本。
    db.colA.aggregate([
    {
    $lookup: {
    from: "colB",
    let: {
    bid: "$_id"
    },
    pipeline: [
    {
    $match: {
    $or: [
    {
    is_delete: false
    },
    {
    is_delete: {
    "$exists": false
    }
    }
    ]
    }
    },
    {
    $unwind: "$items"
    },
    {
    $match: {
    $expr: {
    $eq: [
    "$items._id",
    "$$bid"
    ]
    }
    }
    },

    ],
    as: "data"
    }
    },
    {
    $project: {
    count: {
    $reduce: {
    input: "$data",
    initialValue: 0,
    in: {
    $add: [
    "$$value",
    "$$this.items.size"
    ]
    }
    }
    }
    }
    }
    ])
    工作Mongo playground

    关于node.js - 具有多个条件的聚合和基于计数键的总和匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64734988/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com