【问题标题】:How to add ObjectId argument to a mongodb lookup如何将 ObjectId 参数添加到 mongodb 查找
【发布时间】:2020-08-31 20:06:09
【问题描述】:

我正在查找本地字段是 ObjectId,而外部字段是 ObjectId 的数组。执行查找给了我错误:

arguments to $lookup must be strings

我已经进行了类似的查找,其中外部字段不是数组(而是 ObjectId),因此错误似乎不明确。我的数据库包含两个集合:歌曲和播放列表。一首歌曲可以属于许多播放列表。我正在尝试编写一个返回匹配歌曲的聚合,其中包含歌曲所属的播放列表数组:

歌曲:

[
  {
    songName: "In Da Club",
    _id: ObjectId(1)
  },
  {
    songName: "Happy Birthday",
    _id: ObjectId(2)
  },
  {
    songName: "Ode to Joy",
    _id: ObjectId(3)
  }
]

播放列表:


[
  {
    _id: ObjectId(4)
    playlistName: "PlaylistOne,
    songs: [ObjectId(1), ObjectId(3)]
  },
  {
    _id: ObjectId(5)
    playlistName: "PlaylistTwo,
    songs: [ObjectId(1)]
  }
]

期望的结果:


{
  songName: "In Da Club",
  _id: ObjectId(1),
  playlists: [
    {
      _id: ObjectId(4),
      playlistName: "PlaylistOne,
    },
    {
      _id: ObjectId(5),
      playlistName: "PlaylistTwo"
    }
  ]
}



我尝试的查询:

db.songs.aggregate([
  {
    $match: {
      songName: "In Da Club"
    }
  },
  {
    $lookup: {
      from: 'playlists',
      let: { songId: '$_id'},
      pipeline: [
        {
          $match: {
            $expr: {
              {
                $in: ["$$songId", "$songs"]
              }
            }
          }
        }
      ],
      as: 'playlists'
    }
  }
])

这似乎是一个相对简单的查询,我不确定如何解决“传递给查找的参数必须是字符串”错误,因为我的查找是基于 ObjectId 的。任何帮助将不胜感激!蒂亚!

【问题讨论】:

  • 除了查询中的几个语法错误之外,一切看起来都很好,在这里测试一下:mongoplayground.net/p/85q9qBsL62X,您的 MongoDB 版本是什么?它托管在哪里?
  • 啊好的-我在本地运行mongodb 3.6版...我将升级到最新版本并重试。谢谢!
  • 我在 3.2***
  • 试一试:mongoplayground.net/p/C7z4pUdvjN- 并告诉我!您可能会遇到同样的问题,但请告诉我会发生什么......
  • 啊,也可以!我什至没有尝试过,因为我认为它行不通,因为外部字段是一个数组......非常感谢!

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

虽然$lookup 是在3.2 版本中引入的,但在后续更新中对其进行了一些增强:

根据文档:

从MongoDB 3.4开始,如果localField是一个数组,可以匹配 针对标量 foreignField 的数组元素,无需 $unwind 阶段。

MongoDB 3.6,增加了对在加入的管道上执行管道的支持 集合,它允许将多个连接条件指定为 以及不相关的子查询。

所以问题可能是由于 mongodb 版本低。无论如何,根据您的要求,您可以使用$lookup,它用于单个相等连接,因为数组位于foreignField

{
    $lookup: {
      from: "playlists",
      localField: "_id", // Scalar value
      foreignField: "songs", // Against an array
      as: "playlists"
    }
  }

测试: mongoplayground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2020-09-09
    • 2018-10-25
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    相关资源
    最近更新 更多