如何在$lookup Mongodb中将字符串转换为objectId作为LocalField

18

我想在 mongodb 中使用 $lookup 添加联接集合。我正在尝试以下操作:

{
 $lookup:{
   from:"User",
   localField:"assignedId",
   foreignField:"_id",
   as:"dataa"}
}

现在我有两个集合

User 包含用户的 objectid,例如 "_id" : ObjectId("56ab6663d69d2d1100c074db"),

Tasks 则包含一个 string 类型的 assignedId,例如 "assignedId":"56ab6663d69d2d1100c074db"

现在,在两个集合中应用 $lookup 不起作用,因为 ID 不匹配。

为此,我通过 Google 找到了一种解决方案,即包括

{ $project: { assignedId: {$toObjectId: "$assignedId"} }}

但这个解决方案对我来说不起作用,它会抛出一个错误:

assert: command failed: { "ok" : 0, "errmsg" : "invalid operator '$toObjectId'", "code" : 15999 } : aggregate failed

请帮助我解决这个问题。

谢谢

1个回答

6

聚合管道中无法实现此功能。没有方法可以转换类型。 您能将Tasks集合中的"assignedId"类型更改为ObjectId吗? 否则,您必须在代码中进行转换,将ObjectId转换为字符串并在另一个查询中使用。


1
好的.....假设在任务集合中,我使用"assignedId":ObjectId("56ab6663d69d2d1100c074db"),现在我想根据assignedId获取任务,那么我该如何编写查询呢... Task.find({assignedId:ObjectId("56ab6663d69d2d1100c074db")},function(err,data){....}) - Saurabh Sharma
1
当您循环遍历结果时,可以对属性执行“toString()”操作,将ObjectId => String进行转换,以便在下一个查找中使用它。例如:Task.find({assignedId : yourvar.toString()}, function(err,data){....}) - HoefMeistert
1
我的意思是,我有一个ownerId,例如56ab6663d69d2d1100c07‌​4db,现在我想从tasks集合中获取数据,如下所示:Task.find({assignedId : ownerId}, function(err,data){....}),但是在tasks集合中,我有一个assignedId,例如ObjectId("56ab6663d69d2d1100c07‌​4db"),那么它将如何工作?如何匹配这些id? - Saurabh Sharma
1
@SaurabhSharma 你可以使用以下代码将字符串 => ObjectId 进行转换: var objectId = require('mongoose').Types.ObjectId; var MyObjectId = new objectId('yourstringobjectid'); - HoefMeistert
你现在不能这样做,请求Mongodb在这里:https://jira.mongodb.org/browse/SERVER-22781 - chemitaxis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接