2015-12-01 34 views
1

我目前有以下查詢返回給定statuscount最近更新的帖子。如何抵消在特定文檔後啓動的貓鼬排序查詢

var query = Post.find() 
    .where('status').equals(status) 
    .sort('-updated') 
    .limit(count); 

如果status是「批准」和count是3,那麼我的結果是這樣的:

[ 
    { 
    "id": "test1", 
    "updated": "2015-11-30T16:51:54.988Z", 
    "status": "approved", 
    }, 
    { 
    "id": "test2", 
    "updated": "2015-11-30T16:51:52.125Z", 
    "status": "approved", 
    }, 
    { 
    "id": "test3", 
    "updated": "2015-11-30T16:51:50.469Z", 
    "status": "approved", 
    } 
] 

我需要能夠指定一個id通過抵消我的結果。

例如,如果status是「批准」,count是2和偏移ID是「測試1」的結果應該是:

[ 
    { 
    "id": "test2", 
    "updated": "2015-11-30T16:51:52.125Z", 
    "status": "approved", 
    }, 
    { 
    "id": "test3", 
    "updated": "2015-11-30T16:51:50.469Z", 
    "status": "approved", 
    } 
] 

所以我被更新的屬性排序結果,但應該只啓動從偏移ID之後的文檔中獲取。

+0

你應該從查詢中排除ID –

+0

@Michelem我剛剛使用test1作爲例子,這將需要爲任何文檔工作,這將意味着排除所有ids更新之前我想要的日期。我不會總是知道他們是什麼樣的,因爲他們一直在被添加。 –

回答

1

我想排除你不需要跳過他們的ID,沒有任何其它的解決方案:

var query = Post.find({ 
     $and: [{ 
      status: status 
     }, { 
      id: { 
       $nin: ['test1'] 
      } 
     }] 
    }) 
    .sort('-updated') 
    .limit(count); 

隨着$nin可以通過使用ID數組排除多個id像這樣:['test1', 'test2', 'etc...']

+0

不幸的是,這不會工作,因爲我需要排除所有ids更新之前我想要的日期。我不能保證我會一直知道他們是什麼樣子的。 –

+0

我認爲你需要檢查你的應用程序的邏輯,因爲我認爲你做得不好。 –

+1

我認爲你是對的,看起來我應該通過更新的屬性而不是特定的文檔進行抵消。就像'where('updated')。gt(aDateObject)''。我會把這個標記爲正確的,因爲看起來這個標題和標題所要求的內容差不多。 –

0

您無法通過特定的ID進行偏移,但可以使用skip()跳過一定數量的文檔。

var query = Post.find() 
    .where('status').equals(status) 
    .sort('-updated') 
    .limit(count) 
    .skip(1); // <<< put the number of docs you want to skip here 

如果你想之前和包括特定ID跳過所有的文件,你必須做手工(我可以張貼代碼,如果您需要什麼)。

編輯

要跳過所有的文件,直到你達到一個特定的文檔:

var query = Post.find() 
    .where('status').equals(status) 
    .sort('-updated') 
    .limit(count); 

var offsetId = 'test1'; 
var filteredDocs = []; 

query.exec().then(function (docs) { 
    var skipped = true; 
    docs.forEach(function (doc) { 
     if (skipped && doc.id == offsetId) skipped = false; 
     if (!skipped) filteredDocs.push(doc); 
    }); 
}); 
+0

感謝您的回答,但我不認爲他們會提供可靠的結果。 使用'skip()'是不可靠的,因爲如果一個帖子在查詢之間更新,它會被'.sort(' - updated')'添加到開頭,這會拋棄跳過數字。 第二種方法不會工作,'.limit(count)'將返回我需要的帖子數量。我必須查詢整個集合以確保我可以跳到所需的文檔並返回正確的金額。 –