2013-08-20 42 views
1

我按照文档中的建议使用Meteor和MongoDB。来自关系数据库背景,我想了解在NOSQL商店中建模数据的策略。流星:相关项目

该场景是我有users,并且每个user有一个vin。所有相当标准和可能与一个集合。但是,如果我想找到最高vin显示了最近购买汽车的一些匿名信息,我只是构建一个找到像:

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

还是有更好的方法来模拟它?如果给定用户有多个vin会怎么样?在一个关系世界里,这是一个“有很多”的关系。但是如果我在用户文档中嵌入vins的数组,我怎么能提取最高的数字。正如你所看到的,我正在从将表格建模为嵌入式文档的根本转变中摔角。

任何帮助表示赞赏,并且(虽然我知道它不是SO方式)我很喜欢任何指向从关系建模模式向无模式迁移的地方。

+2

略微o/t,但10gen目前正在做一个针对node.js开发者的在线课程。 m101js,你可能会发现将你的关系/ sql连接到基于文档的数据库很有用。 https://education.10gen.com/courses/10gen/M101JS/2013_August/about – booyaa

回答

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函数中的最高者。

1

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

Aggregation framework

例如,你有类似这样的项目:

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

开卷将创建两个新项目的这一预测:

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

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

,你可以看到阵列场改变整数

+0

需要注意的是,聚合框架在客户端不起作用(还没有?) – Dave

+0

在客户端,你还没有mongo。 – Denis

+1

您在Meteor的客户端上有迷你mongo,这不会在那里工作,这意味着需要服务器端调用。 – Dave