猫鼬聚合匹配返回空数组

时间:2018-11-26 21:32:32

标签: mongodb mongoose

我正在使用mongodb处理mongoose聚合,并且我怀疑我的应用程序在做什么错。

这是我的文件:

{
    "_id": "5bf6fe505ca52c2088c39a45",
    "loc": {
        "type": "Point",
        "coordinates": [
            -43.......,
            -19......
        ]
    },
    "name": "......",
    "friendlyName": "....",
    "responsibleName": "....",
    "countryIdentification": "0000000000",
    "categories": [
        "5bf43af0f9b41a21e03ef1f9"
    ]
    "created_at": "2018-11-22T19:06:56.912Z",
    "__v": 0
}

在我的应用程序上下文中,我需要通过GeoJSON搜索文档,然后使用geoNear执行此搜索。好的,它工作正常!但是此外,我需要在文档中“匹配”或“过滤”特定的“类别”。我认为可以使用$match,但我肯定做错了。这是代码:

CompanyModel.aggregate(
                [
                    {
                        "$geoNear": {
                            "near": {
                                "type": "Point",
                                "coordinates": [pageOptions.loc.lng, pageOptions.loc.lat]
                            },
                            "distanceField": "distance",
                            "spherical": true,
                            "maxDistance": pageOptions.distance
                        }
                    },
                    {
                        "$match": {
                            categories: { "$in": [pageOptions.category] }
                        }
                    }
                ]
            ).then(data => {

                resolve({ statusCode: 200, data: data });

            }).catch(err => {
                console.log(err);
                reject({ statusCode: 500, error: "Error getting documents", err: err });
            })

pageOptions:

var pageOptions = {
            loc: {
                lat: parseFloat(req.query.lat),
                lng: parseFloat(req.query.lng)
            },
            distance: parseInt(req.query.distance) || 10000,
            category: req.params.category || ""
        }

如果我删除$match,则可以按位置获取所有文档,但是我需要过滤特定的类别...我不认为我需要手动过滤它,我相信聚合可以实现功能...

那么有人可以帮助我实现此mongoose吗?

感谢所有帮助

1 个答案:

答案 0 :(得分:1)

在MongoDB中,您需要确保文档中的数据类型与查询中的数据类型匹配。在这种情况下,您有一个字符串存储在数据库中,并且您尝试使用 ObjectId 构建not null阶段。要解决您可以在$match上使用valueOf()运算符的问题,请尝试:

pageOptions.category