如何在mongodb查找中添加ObjectId参数?

问题描述 投票:0回答:1

我正在做一个查找,其中本地字段是一个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)
  }
]

Playlists:


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

Desired outcome:


{
  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的。任何帮助将是非常感激的 TIA!

mongodb lookup
1个回答
2
投票

虽然 $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

© www.soinside.com 2019 - 2024. All rights reserved.