我有 2 個收藏集、用戶和曲目。當我獲取用戶個人資料時,我想獲取他的蹤跡。用戶物件有tracks一個軌道 ID 陣列,第二個集合是軌道。
現在我在下面運行此代碼:
users
.aggregate([
{
$match: { _id: ObjectId(userId) },
},
{
$lookup: {
from: "tracks",
localField: "tracks",
foreignField: "_id",
as: "tracks",
},
},
{
$unwind: {
path: "$tracks",
preserveNullAndEmptyArrays: true,
},
},
{
$group: {
_id: ObjectId(userId),
username: { $first: "$username" },
profileImg: { $first: "$profileImg" },
socialLinks: { $first: "$socialLinks" },
tracks: {
$push: {
_id: "$tracks._id",
name: "$tracks.name",
categoryId: "$tracks.categoryId",
links: "$tracks.links",
mediaId: isLogged ? "$tracks.mediaId" : null,
thumbnailId: "$tracks.thumbnailId",
views: { $size: { $ifNull: ["$tracks.views", []] } },
downloads: { $size: { $ifNull: ["$tracks.downloads", []] } },
uploadedDate: "$tracks.uploadedDate",
},
},
},
},
])
如果用戶沒有軌道或沒有軌道,則該$ifNull陳述句僅回傳具有這些欄位的物件,因此如下所示:
user: {
// user data
tracks: [{ views: 0, downloads: 0, mediaId: null }]
}
沒有找到軌道所以"tracks.views"無法讀取所以我添加了 $ifNull 陳述句,如何避免它回傳空資料?同時,API呼叫知道用戶是否登錄或不(isLogged),我設定mediaId到null。如果沒有找到曲目,為什么代碼仍然只添加這3個欄位?沒有軌道可以通過它們...
編輯:任何軌道具有downloads和views含人下載/觀看賽道,賽道看起來像這樣的用戶ID
{
"name": "New Track #2227",
"categoryId": "61695d57893f048528d049e5",
"links": {
"youtube": "https://www.youtube.com",
"soundcloud": null,
"spotify": null
},
"_id": "616c90651ab67bbd0b0a1172",
"creatorId": "61695b5986ed44e5c1e1d29d",
"mediaId": "616c90651ab67bbd0b0a1171",
"thumbnailId": "616c90651ab67bbd0b0a1170",
"plays": [],
"status": "pending",
"downloads": [],
"uploadedDate": 1634504805
}
當獲取的用戶還沒有任何跟蹤帖子時,我會收到一個陣列,其中包含一個包含上述欄位的物件。
當用戶沒有軌道時,我期望得到的是一個空陣列,正如您在上面的回應中看到的那樣,軌道物件未滿并且僅包含具有零值和空值的條件鍵。底線我想要長度views并且downloads僅當有一條或更多條軌道時mediaId,我也想要隱藏它以防用戶未登錄。如果沒有曲目,我不明白為什么它會回傳這 3 個欄位
當用戶有一個或多個軌道時的預期結果
user: {
// user data
tracks: [
{
name: "New Track #2227",
categoryId: "61695d57893f048528d049e5",
links: {
youtube: "https://www.youtube.com",
soundcloud: null,
spotify: null,
},
_id: "616c90651ab67bbd0b0a1172",
creatorId: "61695b5986ed44e5c1e1d29d",
mediaId: "616c90651ab67bbd0b0a1171",
thumbnailId: "616c90651ab67bbd0b0a1170",
plays: 0,
status: "pending",
downloads: 0,
uploadedDate: 1634504805,
},
];
}
當用戶沒有曲目時的預期結果
user: {
// user data
tracks: [];
}
uj5u.com熱心網友回復:
您還可以將查詢修改為如下所示:(在此處查看現場演示)
此查詢使用條件推送通過$cond與$and運算子結合來搜索多個條件。如果tracks.downloads或tracks.plays不大于 0,我們使用$$REMOVE變數(它只是忽略該檔案并回傳一個空陣列,就像您正在尋找的那樣)。
詢問
db.users.aggregate([
{
$match: {
_id: ObjectId("616c80793235ab5cc26dbaff")
},
},
{
$lookup: {
from: "tracks",
localField: "tracks",
foreignField: "_id",
as: "tracks"
}
},
{
$unwind: {
path: "$tracks",
preserveNullAndEmptyArrays: true
}
},
{
$group: {
_id: ObjectId("616c80793235ab5cc26dbaff"),
username: {
$first: "$username"
},
profileImg: {
$first: "$profileImg"
},
socialLinks: {
$first: "$socialLinks"
},
tracks: {
$push: {
// "IF" plays and downloads > 0
$cond: [
{
$and: [
{
$gt: [
"$tracks.plays",
0
]
},
{
$gt: [
"$tracks.downloads",
0
]
},
]
},
// "THEN" return document
{
_id: "$tracks._id",
name: "$tracks.name",
categoryId: "$tracks.categoryId",
links: "$tracks.links",
mediaId: "$tracks.mediaId",
thumbnailId: "$tracks.thumbnailId",
plays2: {},
plays: "$tracks.plays",
downloads: "$tracks.downloads",
uploadedDate: "$tracks.uploadedDate"
},
// "ELSE" remove
"$$REMOVE"
]
}
}
}
}
])
uj5u.com熱心網友回復:
將此階段附加到您的管道:
{
$set: {
tracks: {
$filter: {
input: "$tracks",
cond: { $ne: [ { $type: "$$this._id" }, "missing" ] }
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326166.html
標籤:节点.js mongodb mongodb-查询 总计的 聚合
