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,将链接指向 &lt;a href="/routename/&lt;%- customer._id %&gt;"&gt;Click Here&lt;/a&gt; 我很确定 Mongo DB ID 是 URL 安全的(提示提示) 您基本上必须创建一个基于 URL 加载信息的动态路由,因此如果您有一个路由:/something/:id/:color/:name,您可以从 req.params.idreq.params.colorreq.params.name 在您的路线内。然后要利用它,在 EJS 中将您的自定义 URL 指向那里,例如 &lt;a href="/something/&lt;%- id %&gt;/&lt;%- color %&gt;/&lt;%- name %&gt;"&gt;Load Custom&lt;/a&gt; 知道了!答案一直都在这里——基本上,不需要额外的 slug,甚至不需要使用 Key 作为 url。因为我索引了 CustomerName 字段,所以我可以将其用作 URL 并将 req.params.customername 发送到 customers/:customername" 谢谢您的帮助!我会研究一下消毒剂的作用

以上是关于mongoose - 呈现不同的值并消除这些值的主要内容,如果未能解决你的问题,请参考以下文章

子查询 django 查询以从对象中获取最大的不同值并返回这些对象

NSFetchRequest:查询不同的值并计算其他属性值

如何获取数组值并使用 Mongoose 进行结构化?

绑定响应中的值并使用 angular2 使用这些值制作复选框

从 Firebase Realtime 获取特定值并收集它们的值

合并数组的值并对重复值求和