【问题标题】:Meteor: Relating Items流星:相关物品
【发布时间】:2013-08-21 22:13:23
【问题描述】:

按照文档的建议,我正在使用 Meteor 和 MongoDB。来自关系数据库背景,我想了解在 NOSQL 存储中建模数据的策略。

场景是我有users,每个user 有一个vin。所有这些都非常标准,并且可以通过一个系列来实现。但是如果我想找到最高的vin 来显示最近购买的汽车的一些匿名信息,我是否只是构建一个类似的查找:

Users.find({}, sort: {vin_number: -1})

或者有更好的建模方法吗?如果给定用户拥有多个vin 怎么办?在关系世界中,这是一种“有很多”关系。但是如果我在用户文档中嵌入一个vins 的数组,我怎么能提取最大的数字。

如您所见,我正在努力应对从将事物建模为表格到嵌入文档的根本转变。

感谢您提供任何帮助,并且(尽管我知道这不是 SO 方式)我喜欢任何指向从关系建模模式到无模式模式的温和迁移的地方的指针。

【问题讨论】:

标签: mongodb database-design meteor


【解决方案1】:

您可以使用转换从 vins 列表中获取最高 vin:

Users.find({}, {sort: {vin_number: -1}, transform: function(doc) {
    doc.vin_number = _.max(doc.vin_number_array);
    return doc;
}})

我从来没有尝试过,我有点不确定是先转换还是先排序。但是,如果您在文档中的 vin_number_array 中有一组 vin 编号,则 vin_number 最终将成为使用下划线的 max 函数的最高编号。

【讨论】:

    【解决方案2】:

    对于数组字段,您可以在聚合框架中使用指令$unwind。它会根据您的项目创建不同的项目,您可以像往常一样轻松过滤它。

    Aggregation framework

    例如,您有与此类似的项目:

    {_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: [1234,5678]}
    

    unwind 将为此投影创建两个新项目:

    {_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 1234}
    
    {_id: 'KJDKDSJKSJDK', type: 'car', manufacturer: 'opel', model: 'vectra', vins: 5678}
    

    如您所见,数组字段已更改为 int。

    【讨论】:

    • 需要注意的是聚合框架在客户端不工作(还没有?)
    • 在客户端你还没有 mongo。
    • 你在 Meteor 的客户端上有 mini-mongo,但这在那儿不起作用,这意味着需要服务器端调用。
    • Mini-mongo 只是内存存储的名称,类似于 mongo api。很难想象对它进行排序或进行大量查询或存储超过 100 个项目。它只是不再缓存。如果你想做繁重的查询,你应该在服务器端进行。
    • 我要说的是,应该向对整个环境不熟悉的 OP 指出,您的解决方案不能在客户端完成。不反对你,只是在寻找 OP。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多