【发布时间】:2020-04-19 02:38:26
【问题描述】:
在我的猫鼬聚合中,我收到Unrecognized expression '$toObjectId' 的错误。我的 MongoDB 版本是 4.2.5,猫鼬版本是 5.9.6。根据文档,此运算符在 4.x 版本中可用,理想情况下应该可以工作。
const trips = await Tickets.aggregate([
{$match: {trip: Utils.strToObjectId(tripid) }},
{$project: {_id:0,status:1, bookedBy:1,name:1,totalFare:1, seats:1, mode:1 }},
{$group: {_id: {$toObjectId:"$bookedBy"}, bookings: {$push: {status: "$status", mode:"$mode", name: "$name", from: "$sourceCity", to: "$destinationCity", seats: "$seats" ,fare: "$totalFare", pnr: "$shortid" }} }},
{$lookup: {from:"users", localField:"bookedBy", foreignField:"_id",as:"user"}},
]);
在我的情况下,bookedBy 被转换为在 $lookup 管道中不匹配的字符串。所以为了解决这个问题,我正在尝试将其转换为 objectId。
感谢任何帮助建议。
【问题讨论】:
-
不知道为什么会失败!!这个
Utils.strToObjectId(tripid)返回什么?另外我猜你的$lookup不起作用,因为你在$group之后保留bookedBy字段,你可以逐步删除并检查它实际失败的位置,但我猜问题不是$group..跨度> -
请告诉
bookedBy字段的值是多少?语法{ $group: { _id: { $toObjectId: "$bookedBy"}是正确的,与$group一起使用。 -
@prasad_ in bookingBy 我有字符串格式的 objectId。例如"5e841a3fa9f5d872777aa476"
-
@whoami 将字符串转换为猫鼬 ObjectId 的简单函数。下面是代码 const strToObjectId = (str)=>{ return mongoose.Types.ObjectId(str); }
-
bookedBy 字段包含 objectId,但它是字符串格式。如果我应用 $lookup 那么它不匹配,因为在 mongodb 中它是 ObjectId。这就是为什么我尝试将输入转换为 ObjectId $toObjectId