【问题标题】:MongoDB query aggregation localField ObjectId string and foreign field ObjectIdMongoDB 查询聚合 localField ObjectId 字符串和外部字段 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

标签: javascript mongodb aggregation-framework objectid


【解决方案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
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2020-05-16
  • 2016-07-03
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多