在lookup中使用_id对象进行mongodb查询

11

我们正试图将_id对象与未能配对的mId外键字段匹配。 正在查找mongodb文档。他们没有任何相关内容。使用mongodb查询是否可能?

文档中的_id为对象。

   "_id" : ObjectId("56ab6663d69d2d1100c074db"),

文档中的mId为字符串类型

"mId" : "56ab6663d69d2d1100c074db",

查询如下:

 collection.aggregate([
                {
                  $lookup:
                    {
                      from: "category",
                      localField: "_id",
                      foreignField: "mId",
                      as: "categories"
                    }
               }
            ])

更新

总之,MongoDB在$lookup中不支持类型转换。因此,为了让上述工作正常,我必须在文档本身中将_id和mId作为ObjectId类型。


mId 是什么?如果它也是一个 ObjectId,那么它应该可以正常工作。 - BatScream
目前它不是ObjectId。所以我们需要将外键设置为ObjectId本身才能使其正常工作? - jit
我假设你想用聚合来模拟JOIN操作。请注意,这种聚合会迭代遍历所有文档,并且对于每个文档都在其他集合上进行一次查询。虽然这可能在只有几百到几千个文档时可以工作,但是当你的集合变得更大时,你需要等待数分钟。 - Markus W Mahlberg
@BatScream 没有理解你的意思。所以你的意思是只有当 _id 和 mId 是 ObjectId 类型时才应该匹配吗? - jit
@Markus W Mahlberg 我没有问题,因为我的数据有限。 - jit
显示剩余7条评论
2个回答

5

从Mongodb 4.0开始,你可以使用$toString聚合操作符将ObjectId转换为字符串。

Jira问题:允许在ObjectId(_id.str)和字符串之间进行$lookup


现在您的查询应该像下面这样:
collection.aggregate([
  { 
    $addFields: { "_id": { "$toString": "$_id" } }
  },
  {
    $lookup: {
      from: "category",
      localField: "_id",
      foreignField: "mId",
      as: "categories"
    }
  }
])

1
非常感谢,这个好用。值得注意的一个有用功能是,$addFields 也可以适用于 foreignField 值——这正是我在我的情况下所需要的。 - Luke Brown
@LukeBrown,您能否详细说明一下如何处理foreignField?由于我们在当前集合上运行聚合,我不清楚您是如何从“另一个”集合中获取需要转换为字符串的字段。 - Sebastian Kristof

0

你可以使用id和mid进行连接。虽然$lookup不支持强制转换,但可以使用$project管道阶段,首先将所有的mid转换为ObjectId,然后尝试$lookup。


我们如何在聚合操作中将字符串转换为对象ID呢? - Prakash Kumar
1
有点晚了,但将此项目阶段添加到聚合中应该可以解决问题: { $project: { _id: {$toObjectId: "$_id"} }} - ashe540
1
ashe540,不存在"$toObjectId"运算符。 - Ivan Gusev
没有 $toObjectId,但我们可以转换为 objectId。请参考此链接:https://dev59.com/H2sz5IYBdhLWcg3wiYc0。 - Parshuram Kalvikatte

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