我正在查找,其中本地字段是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,因此我不确定如何避免“传递给查询的参数必须是字符串”错误。任何帮助将不胜感激!TIA!
虽然$ lookup是在版本中引入的,3.2
但是在随后的更新中对其进行了一些增强:
根据文档:
从MongoDB 3.4开始,如果localField是一个数组,则可以将数组元素与标量foreignField进行匹配,而无需$ unwind阶段。
MongoDB 3.6增加了对在联接的集合上执行管道的支持,它允许指定多个联接条件以及不相关的子查询。
因此,问题可能出在mongodb版本较低。无论如何,您都可以使用$lookup
on数组用于单等联接foreignField
。
{
$lookup: {
from: "playlists",
localField: "_id", // Scalar value
foreignField: "songs", // Against an array
as: "playlists"
}
}
测试: mongoplayground
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句