【问题标题】:How to convert string to objectId in LocalField for $lookup Mongodb [duplicate]如何在 $lookup Mongodb 的 LocalField 中将字符串转换为 objectId [重复]
【发布时间】:2017-06-01 01:21:28
【问题描述】:

我想在 mongodb 中使用 $lookup 添加连接集合。我正在尝试如下

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

现在我有两个系列

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

Tasks 其中包含 assignedId 作为 string "assignedId":"56ab6663d69d2d1100c074db"

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

为此,我搜索了它并找到了一个包含的解决方案

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

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

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

请帮我解决这个问题。

谢谢

【问题讨论】:

    标签: mongodb join lookup


    【解决方案1】:

    在聚合管道中是不可能的。没有转换类型的方法。 您可以将 Tasks 集合中的“assignedId”类型更改为 ObjectId 吗? 否则,您必须在代码中执行此操作,将 ObjectId 转换为 String 并在另一个查询中使用。

    【讨论】:

    • OK.....假设在任务集合中我做"assignedId":ObjectId("56ab6663d69d2d1100c074db"),现在我想根据assignedId获取任务,那么我该如何编写查询...Task.find({assignedId:ObjectId("56ab6663d69d2d1100c074db")},function(err,data){....})
    • 当您遍历结果时,您可以对属性执行“toString()”以转换 ObjectId => String,以便在下一次查找中使用它。比如:Task.find({assignedId : yourvar.toString()}, function(err,data){....})
    • 我的意思是,我有像 56ab6663d69d2d1100c07‌​4db 这样的 ownerId,现在我想从 tasks 集合 Task.find({assignedId : ownerId}, function(err,data){....}) 获取数据,但是在任务集合中我有 assignedIdObjectId("56ab6663d69d2d1100c07‌​4db") 那么它将如何工作?如何匹配 id 的
    • @SaurabhSharma 您可以使用以下方法转换字符串 => ObjectId: var objectId = require('mongoose').Types.ObjectId; var MyObjectId = new objectId('yourstringobjectid');
    • 谢谢...它的工作
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 2022-01-02
    • 2011-12-11
    • 2018-11-09
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多