首页 > 解决方案 > 仅基于非空数组的字段匹配

问题描述

我正在尝试对某些东西进行过滤。这是我的Order模型的简化布局:

{
    merchant: <Reference to the merchant>,
    date: <Date Object>
    name: "Some order name",
    ingredients: [{
        ingredient: {data: "some data"}
        otherData: "some data"
    }]
}

我想根据文档中包含的成分查询文档。我有一系列要通过“objectifiedIngredients”搜索的项目。如果里面有成分,那么我想搜索包含该成分的订单。如果数组为空,那么我不想进行查询而只获取所有订单。“objectifiedIngredients”是 ObjectId 的列表。这是我到目前为止所拥有的:

      Order.aggregate([
            {$match:{
                merchant: new ObjectId(req.session.user),
                date: {
                    $gte: from,
                    $lt: to
                },
                ingredients: {
                    $elemMatch: {
                        ingredient: {
                            $in: objectifiedIngredients
                        }
                    }
                }
            }}
        ])

$match仅当数组中包含元素时,如何运行on 成分?我尝试过使用$cond,但要么在这里不起作用,要么我没有正确使用它。

标签: javascriptnode.jsmongodbmongoose

解决方案


试试这个

Order.aggregate([
            {$match:{
                merchant: new ObjectId(req.session.user),
                date: {
                    $gte: from,
                    $lt: to
                },
                ingredients: {
                    $ne: false
                }
            }}
        ])

您可以在此处查看更多详细信息


推荐阅读