繁体   English   中英

如何根据数组内的键对mongo doc进行分组?

[英]How to group mongo doc based on key inside an array?

我有一个包含这些文件的集合:

{
    sku: 1,
    values: [{x: false, z: 100}]
}
{
    sku: 1,
    values: [{z: 100}]
}
{
    sku: 2
    values: [{x: false, z: 100}]
}

请注意,带有sku 2的文档没有重复,但它在数组内的对象中具有键x

如何查询按sku分组的文档并获得没有x键但同时也获得不重复但具有x键的sku的文档?

我期望的结果是:

{
    sku: 1,
    values: [{z: 100}]
}
{
    sku: 2,
    values: [{x: false, x: 100}]
}

我想忽略一个文档,如果它被密钥sku复制并且有密钥x: false但如果该文档没有被sku复制以获取它

因此,重新表述您的要求:如果有多个具有特定sku文档,您希望使用x: false过滤掉所有值

您需要聚合框架的$group来获取单个sku所有数据。 然后您可以使用$concatArrays运行$ reduce以压平values数组和$filter作为应用您的业务规则的最后一步:

db.collection.aggregate([
    {
        $group: {
            _id: "$sku",
            count: { $sum: 1 },
            values: { $push: "$values" }
        }
    },
    {
        $addFields: {
            values: {
                $reduce: {
                    input: "$values",
                    initialValue: [],
                    in: { $concatArrays: [ "$$value", "$$this" ] }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            sku: "$_id",
            values: {
                $filter: {
                    input: "$values",
                    cond: {
                        $or: [
                            { $eq: [ "$count", 1 ] },
                            { $ne: [ "$$this.x", false ] }
                        ]
                    }
                }
            }
        }
    }
])

蒙戈游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM