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

MongoDB 聚合 $lookup 不适用于 $group

提高查询性能mongodb

Paginate数组在文件mongodb聚合中

MongoDB在具有附加字段的对象数组上聚合$lookup

MongoDB在具有附加字段的对象数组上聚合$lookup

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