類別
{
"_id" : ObjectId("61740086893f048528d166b9"),
"name": "Category1",
"tracks" : [
"61c65353565a2d9a1cd3020d",
"61c74518962dc3efb96c3438",
"61c74775703176a6f72df444"
]
}
曲目
{
"_id" : ObjectId("61c65353565a2d9a1cd3020d"),
"name" : "Track1",
"categoryId" : ObjectId("61740086893f048528d166b9"),
"creatorId" : ObjectId("61c6478304e98ed63e8ee7d3"),
"thumbnailId" : ObjectId("61c65353565a2d9a1cd3020c"),
"plays" : [],
"media" : {
"type" : "wav",
"url" : ""
},
"status" : "approved",
"downloads" : [],
"uploadedDate" : 1640387411
}
假設我有 5 個類別,每個類別有很多曲目 ID,我想為每個類別獲取最后 N 個曲目,所以我在下面使用了這個代碼
categories.aggregate([
{
$project: {
tracks: { $slice: ["$tracks", -2] },
},
},
]
回應是
[
{
"_id": "61740086893f048528d166b9",
"tracks": [
"61c74518962dc3efb96c3438",
"61c74775703176a6f72df444"
]
},
{
"_id": "61740094893f048528d166c1",
"tracks": []
},
{
"_id": "617400a0893f048528d166cb",
"tracks": []
}
]
到目前為止還不錯,但問題是如何將每個類別的軌道從 ID 陣列替換為物件陣列?
我試過$loopup了,但我可能沒有localField正確實施。
預期結果
[
{
"_id": "61740086893f048528d166b9",
"tracks": [
{
"_id": ObjectId("61c74518962dc3efb96c3438")
...
},
{
"_id": ObjectId("61c74775703176a6f72df444")
...
}
]
},
{
"_id": "61740094893f048528d166c1",
"tracks": []
},
{
"_id": "617400a0893f048528d166cb",
"tracks": []
}
]
***** 更新 *****
我正在嘗試替換creatorId集合中createdBy用戶的物件users
用戶
{
"_id": ObjectId("61c6478304e98ed63e8ee7cb"),
"email": "[email protected]",
"username": "USER999",
"tracks": [
ObjectId("61c65353565a2d9a1cd3020d"),
],
}
預期的結果應該是
[
{
"_id": "61740086893f048528d166b9",
"tracks": [
{
"_id": ObjectId("61c74518962dc3efb96c3438"),
"createdBy": {
"_id": "userId"
...
},
...
},
{
"_id": ObjectId("61c74775703176a6f72df444"),
"createdBy": {
"_id": "userId"
...
}
...
}
]
},
{
"_id": "61740094893f048528d166c1",
"tracks": []
},
{
"_id": "617400a0893f048528d166cb",
"tracks": []
}
]
除了下面的解決方案ray,我在這里添加了代碼https://mongoplayground.net/p/8AjmnL-vhtz
位于createdBy頂層,但不是在每個軌道下
uj5u.com熱心網友回復:
$lookupTracks是您在集合中找到相應物件的正確方法。為什么您的代碼不起作用是因為您將字串存盤在集合中的tracks陣列中;Categories而_id集合Tracks是 ObjectId。$lookup由于資料型別不匹配,因此不會有任何結果。您可以做的是使用$toObjectIdin a將字串轉換為 ObjectId $map,然后執行$lookup
db.categories.aggregate([
{
$project: {
tracks: {
$slice: [
"$tracks",
-2
]
}
}
},
{
$project: {
tracks: {
"$map": {
"input": "$tracks",
"as": "t",
"in": {
"$toObjectId": "$$t"
}
}
}
}
},
{
"$lookup": {
"from": "tracks",
let: {
t: "$tracks"
},
pipeline: [
{
$match: {
$expr: {
"$in": [
"$_id",
"$$t"
]
}
}
}
],
"as": "tracks"
}
}
])
這是Mongo游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/414149.html
標籤:
