流星:关联物品

时间:2013-08-20 00:45:21

标签: mongodb database-design meteor

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

方案是我有users,每个user都有一个vin。一切都很标准,可以与一个系列。但是,如果我想找到最高vin来显示一些关于最近购买的汽车的匿名信息,我是否只想构建一个像:

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

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

正如您所看到的,我正在努力解决从将事物建模为嵌入式文档的根本转变。

任何帮助都表示赞赏,并且(虽然我知道这不是SO方式)但我喜欢任何可以从关系建模模式轻松迁移到无模式的地方的指针。

2 个答案:

答案 0 :(得分: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 :(得分: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}

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