2016-02-03 150 views
2

這個想法是將一種行號返回給mongodb聚合命令/管道。類似於我們在RDBM中所做的。在mongodb聚合命令/管道中添加某種行號

它應該是一個唯一的數字,如果它完全匹配一行/數字就不重要。

對於這樣的查詢:

[ { $match: { "author" : { $ne: 1 } }} , { $limit: 1000000 } ] 

返回:

{ "rownum" : 0, "title" : "The Banquet", "author" : "Dante", "copies" : 2 } 
{ "rownum" : 1, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 } 
{ "rownum" : 2, "title" : "Eclogues", "author" : "Dante", "copies" : 2 } 
{ "rownum" : 3, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 } 
{ "rownum" : 4, "title" : "Iliad", "author" : "Homer", "copies" : 10 } 

是否有可能產生這樣的rownum在MongoDB中?

+0

不,這是不可能的。你可能會更好地解釋*「爲什麼你認爲你需要這個」*。它通常用於SQL實現窗口化分頁結果,比如項目排序。如果您想解釋您的用例,可能還有其他選擇。 –

+0

這是一個改進 - 當數據量很大時(> 100mio),在使用MongoDB數據源獲取數據的BI工具上使用id作爲字符串真的是一個壞主意。除非... – ic3

+0

將數字添加到MongoDB中的行(您無法做到這一點)意味着要通過所有結果/數據(大概在選擇「頁面」之前)並一次分配一行。所以,由於架構的作用方式決不會有任何改進。我給你的選擇。 1.接受「不能完成」。 2.解釋你的用例,並可能給出一個比迄今爲止能夠想到的更好的替代方法。正如我所看到的,一個是死路一條,另一個可能只是去某個地方。 –

回答

2

不確定大查詢的性能,但這至少是一個選項。

您可以通過分組/推添加到數組,然後用includeArrayIndex這樣的放鬆:

現在
[ 
    {$match: {author: {$ne: 1}}}, 
    {$limit: 10000}, 
    {$group: { 
    _id: 1, 
    book: {$push: {title: '$title', author: '$author', copies: '$copies'}} 
    }}, 
    {$unwind: {path: 'book', includeArrayIndex: 'rownum'}}, 
    {$project: { 
    author: '$book.author', 
    title: '$book.title', 
    copies: '$book.copies', 
    rownum: 1 
    }} 
] 

,如果你的數據庫中包含的記錄數量較大,並且打算進行分頁,你可以使用$ skip階段,然後$ limit 10或20,或者每頁顯示的任何內容,只需將$ skip階段中的數字添加到您的rownum中,即可獲得真實位置,而無需推送所有結果列舉它們。

+1

這看起來非常低效,但這是我所需要的並且回答了這個問題。 – VillasV