1

我一直在开发产品目录。我的所有需求都非常适合 MongoDB,但有一个问题:

有如下结构的类别:

{
 title:"Auto", // for h1 on page
 id: 1,        // for urls
 level: 1,     //
 left: 2,      // nested set implementation
 right:10      //
}

当用户访问像“ www.example.com/category/1 ”这样的网址时,我需要显示 html 表单来过滤显示的商品。我很确定在服务器上存储每个类别的静态定义是个坏主意(大约 300 个类别,我使用的是 Django => 300 个表单模型?)

所以我的想法是在 MongoDB 中存储有关每个类别的元信息。经过一番研究,我发现我需要 3-4 个“html 小部件”来构建我需要的任何过滤器表单。

例如:

范围字段在 HTML 中将如下所示

<fieldset>
<legend>Price</legend>

<label for="price_from">from</label>
<input type="text" name="price_from">

<label for="price_to">to</label>
<input type="text" name="price_to">
</fieldset>

及其 MongoDB JSON 表示:

{
 name:"price",
 title:"Price",
 type:"range",      // "range" type - 2 inputs with initial values
 categories:[1,2,5],// categories to which this so called "widget" relates
 values:[
   {from: 100},
   {to: 500}
 ]

}

再举一个例子:

选择组:

它的 HTML 版本

 <fieldset>
   <legend>Size and color</legend>

   <select name="size">
    <option value="small">Small size</option>
    <option value="medium">Medium size</option>
    <option value="huge">Huge size</option>
   </select>
   <select name="color">
    <option value="white">White color</option>
    <option value="black">Black color</option>
    <option value="purple">Purple color</option>
   </select>
 </fieldset>

及其 MongoDB JSON 版本:

{
  title:"Size and color",
  type:"selectgroup",
  categories:[2,4,6]
  items:[
         {
           name:"size",
           values:["small", "medium", "huge"]
         },
         {
           name:"color",
           values:["white", "black", "purple"]
         }
  ]
}

所以主要思想是:按 category_id 从集合中获取所有小部件,解析它们并打印完整的 HTML 表单。

优点

  • 轻松将任何新类型的小部件添加到数据库
  • 易于为此类小部件添加解析器以从 JSON 生成 HTML
  • 每个小部件可以与许多类别相关 => 没有重复项

缺点

  • 小部件的集合没有更少或更多固定的文档结构(实际上我在这里看不到真正的问题)
  • 与小部件相关的所有值都被嵌入。
  • 硬验证,因为字段是动态的 => 服务器端没有相应的模型(现在我不知道如何验证这个)

我的问题是:有人知道这样做的更好方法吗?我的方法的优点很酷,但缺点很糟糕。

感谢您的帮助,抱歉英语不好。

4

2 回答 2

1

如果您只需要 3-4 组表单小部件来显示 300 多个类别的所有必要查询表单,则应该使用 Django 表单来指定小部件。您不需要 300 多个 Django 表单,因为您可以轻松地在一页中使用多个表单。

举个简单的例子,你的

<fieldset>
<legend>Price</legend>

<label for="price_from">from</label>
<input type="text" name="price_from">

<label for="price_to">to</label>
<input type="text" name="price_to">
</fieldset>

会成为

class PriceForm(forms.Form):
    price_from = forms.IntegerField()
    price_to = forms.IntegerField()

...当然还有嵌入表单的模板,该表单将提供<fieldset>其他必要的 html 文档结构。

编辑:您的表单标签等似乎取决于类别,您仍然需要在 mongodb 的类别文档中了解有关表单的一些信息。但是,通过使用 django 表单,您可以免费获得许多有用的功能,例如输入验证。

您可能可以通过将特定类别的值(标签等)从 mongodb 以及必要的表单提供给模板的方式对模板进行参数化。

于 2012-05-06T19:19:43.247 回答
1

使用 Map/Reduce 构建动态过滤(分面)搜索的技术:http: //ianwarshak.posterous.com/faceted-search-with-mongodb

我已成功将代码迁移到 Python(并在 Django 项目中使用它)。

于 2012-05-07T10:37:28.393 回答