2017-09-28 56 views
0

我有20萬個文檔的集合,每個包含「客戶名稱」字段。有大約1k獨特的「customerName」值。 (該字段建立索引)貓鼬 - 呈現不同的價值觀和slugify這些值

我需要使這些客戶的名單,併爲每一個蛞蝓,這樣我可以在我的路由URL中使用。

下一步將呈現一個頁面,顯示所有包含客戶名稱的文件每個客戶名稱。

這裏是我迄今爲止,

/// Customer.js

const rmaSchema = new Schema({ 
    CustomerName: { type: String, index: true }, 
    slug: String }, 
    { collection : 'mycompany' // collection name 
    }); 

rmaSchema.pre('save', function(next) { 
    this.slug = slugify(this.CustomerName) ; 
    next(); 
}); 

const rmaModel = mongoose.model('Rma', rmaSchema); 

module.exports = rmaModel; 

// function to slugify a name 
function slugify(text) { 
    return text.toString().toLowerCase() 
    .replace(/\s+/g, '-')   // Replace spaces with - 
    .replace(/[^\w\-]+/g, '')  // Remove all non-word chars 
    .replace(/\-\-+/g, '-')   // Replace multiple - with single - 
    .replace(/^-+/, '')    // Trim - from start of text 
    .replace(/-+$/, '');   // Trim - from end of text 
} 

/// Customer.Controller.js

function showCustomers(req, res){ 

Rma.distinct('CustomerName', function(err, customers) { 
    if (err){ 
     res.status(404); 
     res.send('customers not found!'); 
    } 

    res.render('pages/customers', {customers: customers}); 

    }); 
}; 

module.exports = showCustomers; 

/// customer.ejs

<table class="table table-bordered table-hover table-striped"> 
    <tbody> 
    <% for (var customer of customers) { %> 
     <tr> 
     <td><%= customer.CustomerName %></td>  
     <td><a href="/events/<%= customer.slug %>" class="btn btn-sm btn-primary">Generate Report</a></td> 
     </tr> 
    <% } %> 
</tbody> 
+0

slu supposed不應該是獨一無二的? – Mikey

回答

0

我不太明白您的控制器邏輯存在,但只是讓我們有一些具體的說說,這裏是你如何在你的路線參考蛞蝓:

app.get('/rma/:slug', function(req, res, next) { 
    console.log(req.params.slug) 
    // mongo query to find slug 
    if (foundRecord) { 
     return res.render('pages/customer', { 
      customer: foundRecord 
     }) 
    } else { 
     return res.render('404', { slug: req.params.slug }) 
    } 
}) 

你蛞蝓功能看起來還不錯。

我想提到的一件事是,在您當前的控制器中,您沒有使用明確的return,所以務必注意,如果用戶遇到404條件,API將爲其設置標題並可能會繼續。我不是100%地肯定與res.send,但你絕對可以既改變爲return res.send()return res.render()到有點心狠起來。退貨將確保它在那一刻退出功能。

如果您遇到與猛擊和去猛擊的問題,我建議你存儲塞與記錄一起,並在用戶不斷更新自己的名字更新。

{ 
    _id: 'g9sd76gft9s87dfgs8d7f' 
    CustomerName: 'Bob Alice', 
    CustomerNameSlug: 'Bob-Alice' 
} 

如由米奇這一評論上面提到的,你會遇到你的路線命名衝突,如果你不具備的獨特蛞蝓。爲了補救,如果你在Mongo DB中存儲了每條記錄的slu you,你可以添加一些使它獨一無二的東西,但是如果你的客戶只通過點擊你的用戶界面到達路由,我只會這樣做而不是手動輸入網址。您可以執行類似slugify( $ {CustomerName} $ {timestamp} )這將提供合理的唯一保證。

嗯,我用了一個模板字符串有StackOverflow的語法高亮似乎不因雙重音的使用喜歡。要清楚的是,這將與slugify(CustomerName + timestamp.toString())得到相同的結果。這只是一個簡單的連接。

+1

謝謝你的迴應!在一天結束時,我不知道我甚至需要slu。。我只是希望能夠顯示所有唯一的客戶名稱,然後在單擊客戶名稱時呈現與該名稱關聯的所有文檔。我有點迷失在如何構建這個 –

+0

我展示的例子可能對此非常有幫助。玩一下使用'routename /:something'的路由,因爲':something'可以用作'req.params.something'。您可以加載視圖和EJS,指向一個鏈接到'Click Here' – agm1984

+0

我很確定Mongo DB ID是URL安全的(提示提示) – agm1984