我有 2 個收藏:
- 辦公室 -
{
_id: ObjectId(someOfficeId),
name: "some name",
..other fields
}
- 檔案 -
{
_id: ObjectId(SomeId),
name: "Some document name",
officeId: ObjectId(someOfficeId),
...etc
}
我需要獲取按涉及辦公室的檔案計數排序的辦公室串列。也應該實作分頁。
我嘗試通過聚合和使用$lookup來做到這一點
const aggregation = [
{
$lookup: {
from: 'documents',
let: {
id: '$id'
},
pipeline: [
{
$match: {
$expr: {
$eq: ['$officeId', '$id']
},
// sent_at: {
// $gte: start,
// $lt: end,
// },
}
}
],
as: 'documents'
},
},
{ $sortByCount: "$documents" },
{ $skip: (page - 1) * limit },
{ $limit: limit },
];
但這對我不起作用
任何想法如何實作這一點?
ps 我需要展示有 0 個檔案的辦公室,所以通過檔案獲取辦公室 - 不適合我
uj5u.com熱心網友回復:
詢問
- 您可以使用查找來加入該欄位,并使用管道進行分組,以便計算每個辦公室的檔案(而不是將檔案放入陣列中,因為您只需要計數)
$set是在頂級欄位中獲得該計數noffices使用欄位排序- 您可以使用跳過/限制方式進行分頁,但如果您的收藏非常大,那么看這個會很慢。或者,您可以使用
_id自然順序進行分頁,或者在每個查詢中檢索更多檔案并將它們保存在記憶體中(而不是僅檢索 1 頁的檔案)
測驗代碼在這里
offices.aggregate(
[{"$lookup":
{"from":"documents",
"localField":"_id",
"foreignField":"officeId",
"pipeline":[{"$group":{"_id":null, "count":{"$sum":1}}}],
"as":"noffices"}},
{"$set":
{"noffices":
{"$cond":
[{"$eq":["$noffices", []]}, 0,
{"$arrayElemAt":["$noffices.count", 0]}]}}},
{"$sort":{"noffices":-1}}])
正如另一個答案指出的那樣,您忘記了_of id,但您不需要使用上述查找let在管道內使用 or 匹配。也不計算陣列的成員,您需要(按計數排序只是組,而不是陣列計算)$expr。但是你也不需要你可以在管道中計算它們,就像上面一樣。$sortByCount$size$size
編輯
詢問
- 您可以在管道中添加您需要的內容或將其洗掉
- 這會保留所有檔案,并計算陣列大小
- 然后排序
測驗代碼在這里
offices.aggregate(
[{"$lookup":
{"from":"documents",
"localField":"_id",
"foreignField":"officeId",
"pipeline":[],
"as":"alldocuments"}},
{"$set":{"ndocuments":{"$size":"$alldocuments"}}},
{"$sort":{"ndocuments":-1}}])
uj5u.com熱心網友回復:
您的查找中有兩個錯誤
在將變數傳遞給$let. 你忘記了_本地$_id欄位的
let: {
id: '$id'
},
在 中$exp,由于您使用的是變數id而不是
Documents集合的欄位,因此您應該使用$$來參考該變數。
$expr: {
$eq: ['$officeId', '$$id']
},
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430441.html
