【发布时间】: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