MongoDB 查询聚合 localField ObjectId 字符串和外部字段 ObjectId
Posted
技术标签:
【中文标题】MongoDB 查询聚合 localField ObjectId 字符串和外部字段 ObjectId【英文标题】:MongoDB query aggregation localField ObjectId string and foreign field ObjectId 【发布时间】:2020-07-15 08:02:59 【问题描述】:我的目标是聚合 2 个集合,其中一个集合,即用户集合,我有一个字符串类型 objectid 数组,表示另一个集合中的实际 id,即图像集合。 我使用以下代码
await dbConn()
return User.aggregate([
$match:_id: mongoose.Types.ObjectId(id)
,
$unwind:'$imgIds'
,
$lookup:
from:'images',
localField:'imgIds',
foreignField:'_id',
as:'imgObjs'
],(err,res)=>console.log(res))
所以用户集合中有一项匹配。然后解构 imgIds 数组并尝试通过查找在两者之间建立连接,而 localField 是一个字符串,_id 是一个 ObjectId。 结果是 ImgObjs 是一个空数组。
对这个有什么想法吗? 我使用的是 Mongo 3.6.12 版本
------------编辑--------------
我在我的服务器行为中发现了一些非常奇怪的东西。当我做一个简单的 findById 调用时,我的图像项是一个 ObjectId 数组。 但是当使用聚合时,ObjecIds 变成了字符串。 有人知道这里发生了什么吗?
【问题讨论】:
您能分享一下您收藏的样品吗? "_id": "$oid": "5e86209dd907804180cb4e11" , "title": "flowers", "url": "https://res.cloudinary.com/dppogsm2u/image/upload/v1585763607/sample.jpg", "user": "5e86216947d8db4d9880ba9b", "__v": 0
"_id": "$oid": "5e86216947d8db4d9880ba9b" , "following": [], "followers": [], "imgIds": ["5e86209dd907804180cb4e12" ] ,“姓名”:“乔希”,“电子邮件”:“json@gmail.com”,“密码”:“123456”,“__v”:0
@DannyBorisOv :您必须至少升级到较新的版本 4.0
或最新的 4.2
。或者您需要在代码中将所有这些字符串转换为 ObjectId()
并更新所有文档,然后您就可以执行您的 $lookup
【参考方案1】:
您需要将字符串转换为对象 ID(或将对象 ID 转换为字符串)。
适用于 Mongo 4.0 或更高版本
您可以使用$toObjectId
来执行此操作。在您的情况下,您可以在放松后添加一个$addFields
阶段:
$addFields:
imgIdObjId: $toObjectId: $imgIds
在您的查找中,您需要使用该字段而不是 imgIds
:
$lookup:
from:'images',
localField:'imgIdObjId',
foreignField:'_id',
as:'imgObjs'
参考结帐: https://docs.mongodb.com/manual/reference/operator/aggregation/toObjectId/
【讨论】:
据我了解,只有 mongo 4 才有可能。要么我可以升级(我不知道该怎么做),要么在以前的版本中有另一种方法。我相信如果没有直接转换的新功能,这种转换也是可能的 您使用的是哪个 mongo 版本?请也将其添加到问题中。 运行 MongoDB 版本:3.6.12以上是关于MongoDB 查询聚合 localField ObjectId 字符串和外部字段 ObjectId的主要内容,如果未能解决你的问题,请参考以下文章