我在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")
}
}
我想使用$ match equals过滤聚合到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"});
}
);
答案 0 :(得分:1)
使用函数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"});
}
);
答案 1 :(得分:1)
如果这里的Mongoose帮助器.match()
方法做了类似于其他查询和更新帮助程序的操作,那将会很好。但是有一个很好的理由说明我没想到它。
你可以在Mongoose的常规.find()
查询中抛出这样的字符串,因为为你使用的模型定义的模式适用于" cast"查询对象中使用的任何字段的类型。所以它只会强迫他们这样做。将字符串转换为ObjectId值。
也许可以在这里建立一些聪明才能意识到这是第一个"管道阶段,但主要原因是它不能以相同的方式工作,因为聚合框架意味着改变"文档远离它们最初带来的定义的模式结构。
因此,您需要导入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"});
}
);
您需要手动执行此操作,因为它无法为您执行此操作。