在查找 localField 中使用 _id 对象的 mongodb 查询

Posted

技术标签:

【中文标题】在查找 localField 中使用 _id 对象的 mongodb 查询【英文标题】:mongodb query using _id object in lookup localField 【发布时间】:2016-07-04 19:14:33 【问题描述】:

我们正在尝试将 _id 对象与无效的 mId 外域匹配。 寻找 mondodb 文档。他们对此一无所知。是否可以使用 mongodb 查询?

_id 作为文档中的对象

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

mId 作为文档中的字符串

"mId" : "56ab6663d69d2d1100c074db",

查询如下:

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

UDPATE

总而言之,mongodb 不支持 $lookup 中的类型强制。所以需要上面的工作我必须有 _id 和 mId 作为 ObjectId 输入文档本身才能使其工作。

【问题讨论】:

什么是mId?如果它也是ObjectId,它应该可以正常工作。 目前不是 ObjectId。所以我们需要将外键设置为 ObjectId 本身来完成这项工作? 不需要。 $lookup 运算符的工作时间与 localField === foreignField 一样长。注意strict 等于。 我假设您想使用该聚合来模拟 JOIN。请注意,此聚合会遍历您的所有文档,并对每个文档的其他集合进行查询。虽然这可能只适用于几百到几千个文档,但当您的集合变得更大时,您将等待几分钟。 @BatScream 没有找到你。所以你的意思是 _id 和 mId 只有当它们是 ObjectId 类型时才应该匹配? 【参考方案1】:

从 Mongodb 4.0 开始,您可以使用$toString 聚合运算符将 ObjectId 转换为字符串。

Jira 问题:Allow $lookup between ObjectId (_id.str) and string


现在您的查询应该如下所示:

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

【讨论】:

这非常感谢。需要注意的一个有用功能是,$addFields 也适用于 foreignField 值——这正是我所需要的。【参考方案2】:

id可以加入mid。虽然$lookup不支持强制转换,但是使用$project pipeline阶段先将mid全部转换为Object Id再尝试$lookup

【讨论】:

我们怎么可能在聚合中进行从字符串到对象 id 的转换?? 聚会有点晚了,但是将这个项目阶段添加到聚合中应该可以工作: $project: _id: $toObjectId: "$_id" ashe540,没有“$toObjectId”运算符。 没有 $toObjectId 但我们可以转换为 objectId 参考这个***.com/questions/7825700/…

以上是关于在查找 localField 中使用 _id 对象的 mongodb 查询的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬聚合反向查找或没有localField的查找[重复]

在查找操作之后隐藏嵌套文档中的_id

$lookup 嵌套对象数组

Mongodb $lookup 不使用 _id

从查找中返回最后一个文档

从查找中返回最后一个文档