如何使用 mongoose 中的聚合查询过滤 $match 等于对象值

How to filter $match equals to object value using aggregate query in mongoose

我在 Mongo 数据库中有以下记录

{
    "_id" : ObjectId("54a0d4c5bffabd6a179834eb"),
    "is_afternoon_scheduled" : true,
    "employee_id" : ObjectId("546f0a06c7555ae310ae925a"),
    "currDate" : ISODate("2014-12-28T18:30:00Z"),
    "modified_date" : ISODate("2014-12-29T04:12:53.677Z"),
    "modified_by" : ObjectId("541a9c223416b36f67cfbfe8"),
    "__v" : 0,
    "manager_schedule" : {
        "afternoon_schedule_details" : {
            "event" : ObjectId("54507897cecff53914c82b6d"),
            "is_afternoon_scheduled" : true
        },
        "modified_by" : ObjectId("541a9c223416b36f67cfbfe8"),
        "modified_date" : ISODate("2014-12-29T04:13:00.432Z")
    }
}

我想使用等于 employee_id 的 $match 来过滤聚合。我在猫鼬中使用以下查询,但我没有得到任何查询结果。方法或查询有问题。但是当我直接在 mongodb 中运行这个查询时,我得到了正确的结果。在这方面需要帮助。

Availability.aggregate() 
            .match( { employee_id : "546f0a06c7555ae310ae925a" } )
            .group({_id : "$employee_id",count: { $sum: 1 }})
            .exec(function (err, response) {
              if (err) console.log(err);
              res.json({"message": "success", "data": response, "status_code": "200"});
            }
        );

使用函数mongoose.Types.ObjectId()获取字符串的ObjectId()然后使用 在$match阶段查询。

var val = mongoose.Types.ObjectId("546f0a06c7555ae310ae925a");
Availability.aggregate() 
            .match( { employee_id : val} )
            .group({_id : "$employee_id",count: { $sum: 1 }})
            .exec(function (err, response) {
              if (err) console.log(err);
              res.json({"message": "success", "data": response, 
                        "status_code": "200"});
            }
);

如果这里的 Mongoose 助手 .match() 方法能像其他查询和更新助手那样做,那就太好了。但我猜这是有充分理由的。

您可以在 Mongoose 中的常规 .find() 查询中抛出这样的字符串,因为为您使用的模型定义的架构应用于 "cast" 查询中使用的任何字段的类型目的。所以它只是 'coerce' 将字符串转换为 ObjectId 值。

也许可以在这里构建一些智能来意识到这是 "first" 管道阶段,但是这不能以相同的方式工作的主要原因是因为聚合框架旨在 "alter" 文档远离它们最初附带的定义模式结构。

因此您需要导入 ObjectId() 函数并使用它来正确转换值:

var ObjectId = require('mongodb').ObjectID();

Availability.aggregate() 
            .match( { employee_id : ObjectId("546f0a06c7555ae310ae925a") } )
            .group({_id : "$employee_id",count: { $sum: 1 }})
            .exec(function (err, response) {
              if (err) console.log(err);
              res.json({"message": "success", "data": response, "status_code": "200"});
            }
        );

您需要手动执行此操作,因为它无法为您完成。