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

我在Mongo数据库中有以下logging

{ "_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。 我在mongoose中使用下面的查询,但我没有得到任何查询的结果。 方法或查询有问题。 但是当我直接在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()获取string的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 helper .match()方法做了类似于其他查询和更新助手所做的事情,那将会非常好。 但是,我猜不出有一个很好的理由。

您可以在Mongoose中的一个常规的.find()查询中像这样抛出一个string,因为为您使用的模型定义的模式被应用于“转换”查询对象中使用的任何字段的types。 所以它只是将string强制转换为一个ObjectId值。

也许可以在这里构build一些智慧来认识到这是“第一”stream水线阶段,但是这不起作用的主要原因是因为聚合框架意在从定义的模式结构“改变”文档他们原来是跟着来的。

所以你需要导入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"}); } ); 

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