【问题标题】:Mongoose aggregate match returns empty arrayMongoose 聚合匹配返回空数组
【发布时间】:2019-04-28 14:05:02
【问题描述】:

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

这是我的文件:

{
    "_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 });
            })

页面选项:

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 吗?

感谢大家的帮助

【问题讨论】:

  • 你能展示样品pageOptions.category吗?
  • 是的。我现在就提出问题。
  • 但我的意思是样本值是5bf43af0f9b41a21e03ef1f9还是ObjectId("5bf43af0f9b41a21e03ef1f9")
  • 对不起,我写错了问题。 Categories 是一个字符串数组。
  • @mickl 感谢您的帮助,该数组是 ObjectId 而不是 String。我太笨了……你能回答我标记为最佳答案的问题吗?

标签: mongodb mongoose


【解决方案1】:

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

{
    "$match": {
        categories: { "$in": [pageOptions.category.valueOf()] }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 2018-09-17
    • 2020-10-10
    • 2020-06-24
    • 2016-05-20
    • 2016-11-16
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多