【问题标题】:mongodb query using _id object in lookup localField在查找 localField 中使用 _id 对象的 mongodb 查询
【发布时间】: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 类型时才应该匹配?

标签: mongodb


【解决方案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 参考这个stackoverflow.com/questions/7825700/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2021-03-14
  • 2016-01-23
  • 2018-09-05
相关资源
最近更新 更多