首页 > 解决方案 > 如何将 Collection.find() 转换为具有多个匹配值的 Collection.aggregate()?

问题描述

我需要将 Collection.find(demandObject) 查询切换到 Collection.aggregate() 函数,但无法正确组合。

我的收藏:

    "movies": [
        {
            "_id": "5e34800b13ad37006c550182",
            "name": "Matrix",
            "genres": [
                "5e2d8a3e503465004beeeb4d",
                "5e2d8a3e503465004beeeb4e",
                "5e2d8a3e503465004beeeb55"
            ],
            "themes": [
                "5e2ddd90783eeb0102da66cd"
            ]
        },
        {
            "_id": "5e34800b13ad37006c550182",
            "name": "Matrix 2",
            "genres": [
                "5e2d8a3e503465004beeeb4f",
                "5e2d8a3e503465004beeeb44",
                "5e2d8a3e503465004beeeb56"
            ],
            "themes": [
                "5e2ddd90783eeb0102da66c7"
            ]
        },
    ]

我有以下查询:

Collection.find({
    "genres": {
        "$all": [
            "5e2d8a3e503465004beeeb4e",
            "5e2d8a3e503465004beeeb4a"
        ]
    },
    "themes": {
        "$all": "5e2ddd90783eeb0102da66be"
    },
    "name": {
        "$regex": "Matrix",
        "$options": "i"
    }
});

我的方法

Collection.aggregate([
    { "$match": 
        { 
            "$and": [
                {"name": { "$regex": "Matrix", "$options": "i" }},
                {"themes": { "$all": ["5e2ddd90783eeb0102da66be"] }},
                {"genres": { "$all": ["5e2d8a3e503465004beeeb4e", "5e2d8a3e503465004beeeb4a"] }}
            ]
        }
    }
]).exec();

find 方法返回我想要的集合,但聚合方法响应始终为空。我究竟做错了什么?

标签: mongodbmongoose

解决方案


同时我找到了解决方案。

首先@prasad_ 是对的,查询与 .find 方法中的查询完全相同。在聚合方法中,查询对接受的值更严格一些。

我试图匹配 ObjectId,但聚合方法不明白这些字符串是 ObjectId,所以你必须先转换它们

new mongoose.Types.ObjectId("5e2ddd90783eeb0102da66be")

并且查询在没有 $and 的情况下工作

 Game.aggregate([
                { "$match": {
                    "genres": {
                        "$all": [
                            "5e2d8a3e503465004beeeb4e",
                            "5e2d8a3e503465004beeeb4a"
                        ]
                    },
                    "themes": {
                        "$all": "5e2ddd90783eeb0102da66be"
                    },
                    "name": {
                        "$regex": "Matrix",
                        "$options": "i"
                    }
                }}
            ]);

我找到了一个相关的答案 Can't use $match with mongoose and the aggregation framework


推荐阅读