2017-09-28 121 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