在查找 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 查询的主要内容,如果未能解决你的问题,请参考以下文章