[英]Get index of an item within mongodb query
我有一個查詢,看起來像:
function getPage(page) {
return db.messages.aggregate(
{
'$group': {
_id: "$subjectID"
}
},
{ '$skip': page * 20 },
{ '$limit' : 20 });
}
假設我有一個我知道的subjectID
出現在該集合的某個地方。 我想做的是寫一些像:
function pageOf(subjectID) {
return Math.floor(db.messages.aggregate(
{
'$group': {
_id: "$subjectID"
}
}).indexOf({__id: subjectID}) / 20);
}
除了我不知道如何編寫該查詢的indexOf
部分。 我想知道mongodb是否可能有某種“接受時間”或“接受”查詢,然后你可以這樣做,然后計算項目數。
如果您的subjectID
是(或可以更改為)單調遞增的值(例如,MongoDB默認的ObjectID),則您可以使用具有適當排序,跳過和限制的常規find()
直接選項。 在這種情況下,您可以查找subjectID $gte
(大於或等於) subjectID
:
var page = 1;
var subjectID = ObjectId("515535a0760fe8735f5f6897");
db.users.find(
{ _id: { $gte : subjectID } }
).sort({'_id':1}).skip(page*20).limit(20)
與MongoDb 2.4一樣,聚合框架中沒有這樣的功能可以根據結果管道中的文檔位置進行匹配。 您可以向MongoDB Jira項目的SERVER隊列提交新功能建議。
聽起來你會想要一個新的管道運算符,例如$matchfrom
,它會忽略任何文件,直到第一次出現$matchfrom
標准。 然后,您可以添加$limit
來獲取下n個項目。 您還希望在$matchfrom
之前排序輸出,以便有可預測的結果。
與具有增加的subjectID相比,這似乎過於復雜,但是可能存在基於更高級搜索標准或在聚合管道中計算的結果進行尋呼的用例。
除了聚合框架中對此類功能的未來支持之外,您還可以選擇在代碼中實現相同的匹配方法:
將舊的group()
聚合命令與finalize()
函數一起使用。 注: group()
不與分片集群的工作。
使用MapReduce和finalize()
函數
從聚合框架中獲取整個結果集,並在應用程序代碼中實現結果的匹配/減少(盡管如果您為每個請求獲取所有頁面,這有點會破壞“分頁”概念)。
使用skip
查詢仍然必須讀取介入的索引條目,因此跳過大量文檔將不會非常有效。
您可以考慮通過從上一頁的最后一個條目開始執行連續的頁面查詢,而不是使用跳過偏移進行分頁(即,第一頁將是$gte
,起始subjectID和后續頁面將是$gt
,最后一個主題ID包含在上一頁)。 這取決於您在用戶界面中如何呈現分頁 - 如果您的UI只能顯示消息的“下一頁”而不是跳轉到特定頁面,則最簡單的方法是使用此方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.