mongoose - 呈现不同的值并消除这些值
Posted
技术标签:
【中文标题】mongoose - 呈现不同的值并消除这些值【英文标题】:mongoose - render distinct values and slugify those values 【发布时间】:2018-03-10 13:59:10 【问题描述】:我有 200k 个文档的集合,每个文档都包含一个“CustomerName”字段。大约有 1k 个唯一的“customerName”值。 (该字段被索引)
我需要呈现这些客户名称的列表并为每个名称生成一个 slug,以便我可以在我的路由 URL 中使用。
下一步是为每个 customerName 呈现一个页面,显示包含该 customerName 的所有文档。
这是我到目前为止所拥有的,
/// 客户.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;
/// 客户.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>
【问题讨论】:
蛞蝓不应该是独一无二的吗? 【参考方案1】:我不太了解您那里的控制器逻辑,但是我们有一些具体的事情要讨论,这里是您如何引用路由中的 slug:
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 )
)
你的 slug 函数看起来不错。
我想提一提的一点是,在您当前的控制器中,您没有使用显式的return
,因此请务必注意,如果用户遇到该 404 条件,您的 API 将为此设置标头并可能继续。我不能 100% 确定 res.send,但您绝对可以同时更改为 return res.send()
和 return res.render()
以加强一点。 return 将确保它在那一刻退出函数。
如果您在 slugging 和 de-slugging 方面遇到问题,我建议您将 slug 与记录一起存储,并在用户更新其姓名时更新它。
_id: 'g9sd76gft9s87dfgs8d7f'
CustomerName: 'Bob Alice',
CustomerNameSlug: 'Bob-Alice'
正如 Mikey 在上面的评论中提到的,如果您没有独特的 slug,您将在您的路线中遇到命名冲突。
作为补救措施,如果您将 slug 与每条记录一起存储在 Mongo DB 中,您可以添加一些使其独一无二的东西,但我只会在您的客户仅通过单击您的 UI 和不手动输入 URL。您可以执行类似slugify(
$CustomerName$timestamp)
之类的操作,这将提供相当独特的保证。
嗯,我在那里使用了一个模板字符串,由于使用了双重重音符号,*** 语法荧光笔似乎不喜欢它。需要明确的是,这将获得与slugify(CustomerName + timestamp.toString())
相同的结果。这只是一个简单的串联。
【讨论】:
感谢您的回复!在一天结束时,我什至不确定我是否需要蛞蝓。我只想能够显示所有唯一的客户名称,然后在单击客户名称时呈现与该名称关联的所有文档。我对如何构建这个有点迷茫 我展示的示例可能对此非常有帮助。尝试在其中使用routename/:something
的路线,因为:something
可以作为req.params.something
使用。您可以加载视图并使用 EJS,将链接指向 <a href="/routename/<%- customer._id %>">Click Here</a>
我很确定 Mongo DB ID 是 URL 安全的(提示提示)
您基本上必须创建一个基于 URL 加载信息的动态路由,因此如果您有一个路由:/something/:id/:color/:name
,您可以从 req.params.id
、req.params.color
和req.params.name
在您的路线内。然后要利用它,在 EJS 中将您的自定义 URL 指向那里,例如 <a href="/something/<%- id %>/<%- color %>/<%- name %>">Load Custom</a>
知道了!答案一直都在这里——基本上,不需要额外的 slug,甚至不需要使用 Key 作为 url。因为我索引了 CustomerName 字段,所以我可以将其用作 URL 并将 req.params.customername
发送到 customers/:customername"
谢谢您的帮助!我会研究一下消毒剂的作用以上是关于mongoose - 呈现不同的值并消除这些值的主要内容,如果未能解决你的问题,请参考以下文章
子查询 django 查询以从对象中获取最大的不同值并返回这些对象
绑定响应中的值并使用 angular2 使用这些值制作复选框