mongodb 在Mongoose中进行查询,根据对象中2个字段的比较,获取所有具有对象数组的文档

4uqofj5v  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(104)

我在schema中有以下数组字段:

const receiptSchema = mongoose.Schema(
    {
        ...
        items: [
            {
                product: { type: mongoose.Schema.ObjectId, ref: 'Product' },
                amount: { type: Number, default: 0 },
                price: { type: Number },
                unit: { type: mongoose.Schema.ObjectId, ref: 'Unit' },
                withdrawn: { type: Number, default: 0 },
            },
        ],
        ...

    })

字符串
我正在做一个聚合管道,需要添加一个步骤来获取所有文档,这些文档具有特定的产品单位以及提取<金额
我可以根据前两个条件,产品和单位,获得文档,代码如下:

pipeline.push({
        $match: {
            items: {
                $elemMatch: {
                    product: mongoose.Types.ObjectId(product),
                    unit: mongoose.Types.ObjectId(unit),
                },
            },
        },
    })


但是我还没有找到一种方法来将withdrawn < amount的条件包含到查询中。
如果有人能帮助我解决这个问题,请。
先谢谢你。

kqqjbcuj

kqqjbcuj1#

如果有人有同样的问题,我通过与chatGPT交谈找到了解决方案

// Add a new field 'filteredItems' that contains only the matched items
    pipeline.push({
        $addFields: {
            items: {
                $filter: {
                    input: '$items',
                    as: 'item',
                    cond: {
                        $and: [
                            {
                                $eq: [
                                    '$$item.product',
                                    mongoose.Types.ObjectId(product),
                                ],
                            },
                            {
                                $eq: [
                                    '$$item.unit',
                                    mongoose.Types.ObjectId(unit),
                                ],
                            },
                            { $gt: ['$$item.amount', '$$item.withdrawn'] },
                        ],
                    },
                },
            },
        },
    })
    // Match documents that have non-empty 'items' array
    pipeline.push({
        $match: {
            items: { $exists: true, $ne: [] },
        },
    })

字符串

相关问题